poj 3661
题目描述:
一个人(牛。。。)跑步,开始时劳累程度是0,一共有N分钟,如果第i分钟跑步的话,能跑di的距离。同时劳累程度加1,如果这一分钟休息的话,劳累程度减一,而且如果一旦休息,就一定要休息到劳累程度为0时才能继续跑。
问第N分钟劳累程度是0的时候最多能跑多远。
解题报告:
dp
dp[i][j] = dp[i - 1][j - 1] di ( j
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;
}
浙公网安备 33010602011771号