洛谷P1353 [USACO08JAN]跑步Running

题目描述
奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行 n 分钟的晨跑。
在每分钟的开始,贝茜会选择下一分钟是用来跑步还是休息。
贝茜的体力限制了她跑步的距离。更具体地,如果贝茜选择在第 i 分钟内跑步,她可以在这一分钟内跑 d_i米,并且她的疲劳度会增加 1。
不过,无论何时贝茜的疲劳度都不能超过 m。
如果贝茜选择休息,那么她的疲劳度就会每分钟减少 1,但她必须休息到疲劳度恢复到 0 为止。
在疲劳度为 0 时休息的话,疲劳度不会再变动。晨跑开始时,贝茜的疲劳度为 0 。
还有,在 n 分钟的锻炼结束时,贝茜的疲劳度也必须恢复到 0,否则她将没有足够的精力来对付这一整天中剩下的事情。
请你计算一下,贝茜最多能跑多少米。
输入格式
第一行两个正整数 n,m。
接下来 n 行,每行一个正整数 d_i。
输出格式
输出一个整数,表示在满足所有限制条件的情况下,贝茜能跑的最大距离。

题目分析:看到这个题不难想到时动态规划,由于有疲劳度的限制,我们设置二维数组
dp[i][j]表示第i天,花费疲劳度为j的时候,所能走的最大距离
dp[i][0]=max(dp[i][0],dp[i-1][0])//
dp[i+j][0]=max(dp[i+j][0], dp[i][j]);//在当前情况下休息的情况
dp[i+1][j+1]=max(dp[i+1][j+1], dp[i][j]+d[i+1]);//在当前情况下不选择休息的情况

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; 
int n,m; 
int d[10315];
int dp[14015][505];//dp[i][j]表示第i天,疲劳度为j走的最大值 
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
} 
int main(){  
  n=read();m=read();
  for(int i=1;i<=n;i++) d[i]=read();
  dp[0][0]=0;
  dp[1][1]=d[1];
  dp[1][0]=0; 
  for(int i=1;i<=n;i++){
  	 for(int j=0;j<=min(i,m);j++){
  	 	 if(!j) dp[i][0]=max(dp[i][0],dp[i-1][0]);
		 else 
		    dp[i+j][0]=max(dp[i+j][0],dp[i][j]);//休息
			dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+d[i+1]); 
	   }
  }
  printf("%d",dp[n][0]);
 
  return 0; 
} 
posted @ 2020-02-16 15:30  south_king  阅读(106)  评论(0)    收藏  举报