poj 3661——Running

来源:互联网 发布:三星clx3305清零软件 编辑:程序博客网 时间:2024/06/04 00:26

题意:一个人跑步,每一分钟如果跑疲劳值就会加一,如果休息疲劳值就会减一,每次只要休息就必须把疲劳值变成0才能继续跑。每分钟有对应的可以跑多远,最后一分钟的时候疲劳值必须是0.求最远能跑多远

思路:状态dp[i][j][k],i表示当前是第几分钟,j表示休息还是跑,k表示当前疲劳值。dp[i][0][e]=dp[i-1][0][e-1]+dis,当e是1的时候可以从dp[i-1][1][0]中得到这个状态。

dp[i][1][e]=dp[i-1][1][e+1]和dp[i-1][0][e+1]中的最大值得到。另外,当e为0时dp[i][1][e]也可以从dp[i-1][1][j]得到。

代码如下:

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int dp[2][2][505];int main(){//    freopen("data.txt","r",stdin);    int n,m;    scanf("%d%d",&n,&m);    memset(dp,-1,sizeof(dp));    dp[1][1][0]=0;    dp[0][1][0]=0;    for(int i=0;i<n;++i)    {        int dis;        scanf("%d",&dis);        int now=i&1;        memset(dp[now],-1,sizeof(dp[now]));        dp[now][1][0]=0;        int top=min(m,i+1);        for(int j=0;j<=top;++j)        {            if(j-1>=0)            {                if(dp[!now][0][j-1]!=-1)                dp[now][0][j]=dp[!now][0][j-1]+dis;                if(j==1&&dp[!now][1][0]!=-1)                dp[now][0][j]=max(dp[now][0][j],dp[!now][1][0]+dis);            }            if(j+1<=top&&dp[!now][1][j+1]!=-1)            {                dp[now][1][j]=dp[!now][1][j+1];            }            dp[now][1][j]=max(dp[now][1][j],dp[!now][0][j+1]);            dp[now][1][j]=max(dp[now][1][j],dp[!now][1][j]);        }        dp[now][1][top-1]=max(dp[now][1][top-1],dp[!now][0][top]);    }    printf("%d\n",max(dp[(n-1)&1][1][0],dp[(n-1)&1][0][0]));    return 0;}


0 0
原创粉丝点击