poj 1946 Cow Cycling DP

dp【n】【e】【d】 表示还有n头奶牛,能量为e,跑d圈所需的最短时间

这里只说一下 n > 1的情况

dp【n】【e】【d】 = min( dp【n-1】【e-p】【d-p】 +dp【1】【e】【p】 )

为什么是这样呢?

因为n头奶牛跑d圈,相当于1头奶牛跑了p圈,剩余n-1头跑了d-p圈(注意一点,不管领头的怎么跑,只要跑了p圈,后面的一定是消耗p点能量,所以时间每次与最前面的一头有关)

要注意,这里是根据d来枚举决策,而不是根据e。。。。

我一开始想根据e来决策,想了好久感觉dp维度太多了。。。。。

AC代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

#define MAX 0x3f3f3f3f

int dp[22][110][110];
int N, E, D;

int DFS( int n, int e, int d ){
    if( dp[n][e][d] != -1 ){
        return dp[n][e][d];
    }
    if( d == 0 ){
        return 0;
    }
    if( e < d || e == 0 ){
        return MAX;
    }
    dp[n][e][d] = MAX;
    if( n == 1 ){
        for( int i = 1; i * i <= e && i <= d ; i++ ){
            dp[n][e][d] = min( dp[n][e][d], DFS( n, e - i * i, d - i ) + 1 );
        }
    }else{
        for( int i = 1; i <= d; i++ ){
            dp[n][e][d] = min( dp[n][e][d], DFS( n - 1, e - i, d - i ) + DFS( 1, e, i ) );
        }
    }
    return dp[n][e][d];
}

int main(){
    while( scanf( "%d%d%d", &N, &E, &D ) != EOF ){
        memset( dp, -1, sizeof( dp ) );
        int ans = DFS( N, E, D );
        if( ans >= MAX ){
            cout << 0 << endl;
        }else{
            cout << ans << endl;
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值