洛谷 题解 P1353 【[USACO08JAN]跑步Running】

动态规划

  • 状态
dp[i][j]表示第i分钟疲劳值为j的最大值
  • 初始
全部都为一个最小值“0”
  • 转移
考虑休息和走
如果当前疲劳值比时间要大,显然不可能出现这种情况
如果比时间小
dp[i][0]=max(dp[i][0],dp[i-j][j]);
还有走的情况
dp[i][0]=max(dp[i-1][j-1]+d[i],dp[i][j]);
  • 答案
根据设计的状态不难得出最终的答案为dp[n][0]

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=10000+10;
const int MAXM=500+10;
int n,m;
int d[MAXN];
int dp[MAXN][MAXM];
inline int read()
{
	int tot=0;
	char c=getchar();
	while(c<'0'||c>'9')
		c=getchar();
	while(c>='0'&&c<='9')
	{
		tot=tot*10+c-'0';
		c=getchar();
	}
	return tot;
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=n;i++)
		d[i]=read();
	for(int i=1;i<=n;i++)
	{
		dp[i][0]=dp[i-1][0];
		for(int j=1;j<=m;j++)
		{
			if(i-j>=0)dp[i][0]=max(dp[i][0],dp[i-j][j]);
			dp[i][j]=max(dp[i-1][j-1]+d[i],dp[i][j]);
		}
	}
	cout<<dp[n][0]<<endl;
	return 0;
}
posted @ 2019-05-07 12:19  hulean  阅读(205)  评论(0)    收藏  举报