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;

}

你可能感兴趣的:(pku)