bzoj1613 贝茜的晨练计划

Description

奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1<=N<=10,000)
分钟的晨跑。在每分钟的开始,贝茜会选择下一分钟是用来跑步还是休息。贝茜的体力限制了她跑步的距离。更具
体地,如果贝茜选择在第i分钟内跑步,她可以在这一分钟内跑D_i(1<=D_i<=1,000)米,并且她的疲劳度会增加1。
不过,无论何时贝茜的疲劳度都不能超过M(1<=M<=500)。如果贝茜选择休息,那么她的疲劳度就会每分钟减少1,
但她必须休息到疲劳度恢复到0为止。在疲劳度为0时休息的话,疲劳度不会再变动。晨跑开始时,贝茜的疲劳度为
0。还有,在N分钟的锻炼结束时,贝茜的疲劳度也必须恢复到0,否则她将没有足够的精力来对付这一整天中剩下
的事情。请你计算一下,贝茜最多能跑多少米。

Input

* 第1行: 2个用空格隔开的整数:N 和 M
* 第2..N+1行: 第i+1为1个整数:D_i

Output

* 第1行: 输出1个整数,表示在满足所有限制条件的情况下,贝茜能跑的最大距离

Sample Input

5 2
5
3
4
2
10

Sample Output

9
输出说明:
贝茜在第1分钟内选择跑步(跑了5米),在第2分钟内休息,在第3分钟内跑
步(跑了4米),剩余的时间都用来休息。因为在晨跑结束时贝茜的疲劳度必须
为0,所以她不能在第5分钟内选择跑步。
 
思路 : 动态规划,dp[i]表示到第i分钟一定是休息好的,此时可以走的最大的距离。
dp[i]可以先等于dp[i-1],表示第i-1分钟的时候也是休息好的。 
其他的可以枚举之前跑了j分钟和休息了j分钟。 
 1 #include<bits/stdc++.h>
 2 using namespace std;  
 3 #define R register int
 4 #define rep(i,a,b) for(R i=a;i<=b;i++) 
 5 #define Rep(i,a,b) for(R i=a;i>=b;i--) 
 6 #define ms(i,a)    memset(a,i,sizeof(a))  
 7 #define gc()       getchar() 
 8 template<class T>void read(T &x){
 9     x=0; char c=0;  
10     while (!isdigit(c)) c=gc();  
11     while (isdigit(c)) x=x*10+(c^48),c=gc();  
12 }
13 int const N=10000+3;  
14 int dp[N],n,m,a[N],sum[N]; 
15 int main(){
16     read(n); read(m);  
17     rep(i,1,n) read(a[i]),sum[i]=sum[i-1]+a[i];  
18     rep(i,1,n) {
19         dp[i]=dp[i-1];  
20         rep(j,1,min(i/2,m)) dp[i]=max(dp[i],dp[i-2*j]+sum[i-j]-sum[i-2*j]);  
21     }
22     cout<<dp[n]<<endl; 
23     return 0; 
24 }
View Code

 

 

posted @ 2019-01-16 14:30  zjxxcn  阅读(231)  评论(0编辑  收藏  举报