poj 3661 Running dp(动态规划)

来源:互联网 发布:2017中超守门员数据 编辑:程序博客网 时间:2024/06/06 19:39

一个没有设置障碍的dp

简单描述下题意 每一分钟你可以选择跑di米或者休息

跑的话疲劳度会+1 休息的话会-1

然后在任何时候疲劳度都不超过m的情况下最后一分钟疲劳度为0能跑的最远距离

思路:

  很容易想到dp,然后dp[i][j][0]表示第i分钟在休息,疲劳度为j的最远距离

                    dp[i][j][1]表示第i分钟在跑,疲劳度为j的最远距离

   然后转移方程的话就看程序好了

#include
#include
#include
using namespace std;
int n,m;
const int maxn=11111;
int dp[maxn][555][2],d[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    for(inti=1;i<=n;i++)
   scanf("%d",&d[i]);
   memset(dp,-1,sizeof(dp));
   dp[0][0][0]=0;
    for(inti=0;i
    for(intj=0;j<=m;j++)
    {
       if(dp[i][j][1]!=-1)
       {
           if(j
           dp[i+1][j+1][1]=max(dp[i+1][j+1][1],dp[i][j][1]+d[i+1]);
           int k=max(0,j-1);
           dp[i+1][k][0]=max(dp[i+1][k][0],dp[i][j][1]);
       }
       if(dp[i][j][0]!=-1&&j==0&&j
       dp[i+1][j+1][1]=max(dp[i+1][j+1][1],dp[i][j][0]+d[i+1]);
       if(dp[i][j][0]!=-1)
       {
           int k=max(0,j-1);
           dp[i+1][k][0]=max(dp[i+1][k][0],dp[i][j][0]);
       }
    }
   printf("%d\n",dp[n][0][0]);
    return0;
}