poj 3661 Running (DP)

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 ;} 

你可能感兴趣的:(poj)