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 ;} 
posted on 2012-04-15 10:15  追逐.  阅读(222)  评论(0编辑  收藏  举报