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[n][0]) ;
}
return 0 ;}
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[n][0]) ;
}
return 0 ;}