[bzoj1613 Usaco2007 Jan]Running贝茜的晨练计划

题目链接

题意

n分钟跑步,每分钟可以跑步或休息

疲惫值的上限为m

  若跑步,第i分钟可以跑Di米,增加一单位疲惫值

  若休息,恢复一单位疲惫值,但必须恢复到疲惫值为0才能继续跑步

  跑步结束时疲惫值必须为0

求最远可以跑的距离

分析

dp

f[i][j]表示第i分钟,疲惫值为j的最远距离

  f[i][j]=f[i-1][j-1]+Di

  f[i][0]=max(f[i-1][0],f[i-j][j])//休息到第i秒刚好疲惫值为0,或疲惫值已经为0而接着休息

注意需要考虑清楚所有情况

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 
 6 int f[10010][505];
 7 int d[10010];
 8 int main(){
 9     //freopen("input.in","r",stdin);
10     //freopen("output.out","w",stdout);
11     int n,m;
12     scanf("%d%d",&n,&m);
13     for (int i=1;i<=n;i++)
14       scanf("%d",&d[i]);
15     
16     memset(f,0,sizeof(f));
17     
18     for (int i=1;i<=n;i++)
19       for (int j=0;j<=m;j++){
20           if (j>0) f[i][j]=max(f[i][j],f[i-1][j-1]+d[i]);
21           if(i-j>0) f[i][0]=max(f[i][0],f[i-j][j]);
22         f[i][0]=max(f[i][0],f[i-1][0]);
23        }
24 
25     printf("%d",f[n][0]);
26     return 0;
27 }
View Code

 

posted @ 2016-12-06 17:03  Vincent_hwh  阅读(220)  评论(0编辑  收藏  举报