奶牛的锻炼

背景 Background  
  USACO
     
     
  描述 Description  
  奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息。若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加1(初始为0)。若她在第i分钟休息,则疲倦程度减少1。无论何时,疲倦程度都不能超过M。另外,一旦她开始休息,只有当疲惫程度减为0时才能重新开始跑步。在第N分钟后,她的疲倦程度必须为0。
     
     
  输入格式 Input Format  
  第一行,两个整数,代表N和M。
接下来N行,每行一个整数,代表D_i。
     
     
  输出格式 Output Format  
  Bessie想知道,她最多能跑的距离。
 
样例输入 Sample Input [复制数据]  
 
     
     
  样例输出 Sample Output [复制数据]  
 
View Code
 1 #include<iostream>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cstring>
 7 
 8 
 9 using namespace std;
10 
11 int n,m;
12 int a[2001];
13 int f[2001][501];
14 
15 
16 int main( )
17 {
18     cin>>n>>m;
19     for(int i=1;i<=n;i++)
20     {
21        scanf("%d",&a[i]);
22     }
23     memset(f,0,sizeof(f));
24     for(int i=1;i<=n;i++)
25     {
26         for(int j=0;j<=m;j++)
27         {
28              if(j!=0)    
29              f[i][j]=f[i-1][j-1]+a[i];
30              else  
31              {
32                  f[i][0]=max(f[i][0],f[i-1][0]);
33                  for(int k=i;k>=1;k--)
34                  {
35                     f[i][0]=max(f[i][0],f[i-k][k]);
36                  }
37              }
38         }
39     }
40     int maxn=0;
41     cout<<f[n][0];
42     system  ("pause");
43     return 0;
44 }
45     
46       

首先这道题有个坑爹的地方,那就是休息必须休息到0才能再开始。对于这个,可以采取一种类似区间动态规划的思想,FOR一遍以前的f[i-k][k],最后还要注意,f[i][0]可由f[i-1][0]递推而来。。。这道题要A掉不简单。。。

原文地址:https://www.cnblogs.com/spwkx/p/2586892.html