pku 3661 Running DP

http://poj.org/problem?id=3661

奶牛在N分钟内锻炼,在每一分钟他可以选择跑步或者休息,每跑一分钟疲劳度加1,每休息一份中疲劳度减1。休息时必须等到疲劳度为0才能继续跑,每分钟所能跑的距离为Di,在跑的过程中疲劳度不能超过m,求奶牛可以跑得最长距离;

dp的题目,拿过来果断的想不出状态转移方程啊,对dp的感觉还是这么弱,以后要加强锻炼。一共有n个点,有限制m,这不是很典型的二维dp码?

dp[i][j] 表示在i分钟时疲劳度为j所能跑得最远距离则有状态转移方程:

如果选择跑步:dp[i][j] = dp[i - 1][j - 1] + val[i] (1<= j <= m && j <= i)

如果选择休息:dp[i][0] = max(dp[i - 1][0],dp[i - j][j]) (i - j >= j) 第二种选择dp[i - j][j]是在i - j >= j时才有的情况因为只有这时前边才会出现疲劳度达到m后在休息的。。

dp好强打。。。。膜拜DP

View Code
#include <iostream>
#include <cstring>
#include <cstdio>
#define N 10007
#define M 507
using namespace std;

int val[N];
int n,m;
int dp[N][M];
int main()
{
    int i,j;
    scanf("%d%d",&n,&m);
    for (i = 1; i <= n; ++i) scanf("%d",&val[i]);
    memset(dp,0,sizeof(dp));
    for (i = 1; i <= n; ++i)
    {
        dp[i][0] = dp[i - 1][0];
        for (j = 1; j <= i && j <= m; ++j)
        {
            if (i - j >= j)
           dp[i][0] = max(dp[i][0],dp[i - j][j]);
           dp[i][j] = dp[i - 1][j - 1] + val[i];
        }
    }
    printf("%d\n",dp[n][0]);
    return 0;
}
posted @ 2012-05-06 10:14  E_star  阅读(205)  评论(0编辑  收藏  举报