题目:http://poj.org/problem?id=3661
题意:一头牛,给出他运动的时间 ts,在运动时间内,它可以选择跑步,也可以选择休息,如果他跑步疲劳值 +1,如果休息疲劳值 -1,如果它在休息,那么必须疲劳值为0时才能跑步,问到第N秒且疲劳值为0时,牛可以跑得最远距离
dp[i][j] 表示 在第 i 秒时 疲劳值为 j 时牛跑的最远距离,那么方程就是 dp[i][j] = dp[i - 1][j - 1] + dis[i] (如果在第 i 秒跑步)dp[i][0] = Max(dp[i][0],dp[i - j][j]) (if( i - j >= j),初始化 dp[i][0] = dp[i - 1][0];
View Code
1 typedef long long ll; 2 const int N = 10001; 3 const int M = 501; 4 int dp[N][M]; 5 int dis[N]; 6 int n,m; 7 int main() 8 { 9 int i,j; 10 //freopen("data.txt","r",stdin); 11 while(scanf("%d%d",&n,&m) != EOF) 12 { 13 for(i = 1; i <= n; i++) 14 scanf("%d",&dis[i]); 15 for(i = 1; i <= n; i++) 16 { 17 dp[i][0] = dp[i - 1][0]; 18 for(j = 1; j <= m && j <= i; j++) 19 { 20 dp[i][j] = dp[i - 1][j - 1] + dis[i]; 21 if(i - j >= j) 22 dp[i][0] = Max(dp[i][0],dp[i - j][j]); 23 24 } 25 } 26 printf("%d",dp[n][0]); 27 } 28 return 0; 29 }