poj 3661

题目描述:

一个人(牛。。。)跑步,开始时劳累程度是0,一共有N分钟,如果第i分钟跑步的话,能跑di的距离。同时劳累程度加1,如果这一分钟休息的话,劳累程度减一,而且如果一旦休息,就一定要休息到劳累程度为0时才能继续跑。

问第N分钟劳累程度是0的时候最多能跑多远。

解题报告:

dp

dp[i][j] = dp[i - 1][j - 1] di ( j  > 0 )
dp[i][0] = max (dp[i - 1][0], dp[k][j-k](j- k>= k && k<= M))

代码:

#include<iostream>
#include<fstream>
using namespace std;
int d[10010];
int dp[510][10010];
void read(){
//    ifstream cin("in.txt");
    int i,j,k;
    int n,m;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        cin>>d[i];
    dp[0][1]=0;
    dp[1][1]=d[1];
    for(j=2;j<=n;j++)
    {
        for(i=1;i<=m;i++)
            dp[i][j]=dp[i-1][j-1]+d[j];
        dp[0][j]=dp[0][j-1];
        for(k=1;k<=m&&k<=j-k;k++)
            dp[0][j]=max(dp[0][j],dp[k][j-k]);
    }
    cout<<dp[0][n]<<endl;
}
int main(){
    read();
    return 0;
}

posted on 2011-02-23 14:36  宇宙吾心  阅读(298)  评论(0)    收藏  举报

导航