您的位置:首页 > 其它

poj 3661 Running (DP)

2012-04-15 10:15 429 查看
http://poj.org/problem?id=3661

到达终点的方式有两种,一是从n-1走到n,二是从某一节点休息到n。

dp[i][j],i代表第几分钟,j代表当前忍耐度。

对于第一种情况,dp[i][j]=dp[i-1][j-1] + d[i] ;

第二种情况,dp[i-1][0]已经计算出来,设dp[i][0]初值为dp[i-1][0],也就是说在i-1分钟忍耐度为0时继续休息到i。

那么dp[i][0] = Max(dp[i][0], dp[i-k][k]) ;

code:

#include<cstdio>
int dp[10005][505] ;
int d[10005] ;
int max(int a, int b){
if(a>b){return a ;}
return b ;
}
int main(){
int n, m, i, j, k ;
while(~scanf("%d%d", &n, &m)){
for(i=1; i<=n; i++)
scanf("%d", &d[i]) ;
dp[0][0] = 0 ;
for(i=1; i<=n; i++){
for(j=1; j<=m; j++)
dp[i][j] = dp[i-1][j-1] + d[i] ;
dp[i][0] = dp[i-1][0] ;
for(k=1; k<=m&&k<=i-k; k++)
dp[i][0] = max(dp[i][0], dp[i-k][k]) ;
}
printf("%d\n", dp
[0]) ;
}
return 0 ;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: