洛谷P1353 跑步

题目链接:点击打开链接

分析:

    首先,这道题有几个必须要知道的条件:

        1.当贝茜开始休息时,她必须要休息到0才能继续跑步;

        2.贝茜在时间过完时的疲劳度必须是0;

        3.贝茜的疲劳度不能超过m

    那么我们就求什么设什么,则dp[i][j]方程表示第i分钟为j的疲劳度时可以跑的最大距离。题目所求的就可以转化为在n分钟为0的疲劳度时可以跑的最大距离,即dp[n][0]。

    转移方程:

        1.在该时间进行跑步:dp[i][j]=max(dp[i-1][j-1]+d[i],dp[i][j]);

        2.开始休息:dp[i][0]=max(dp[i-j][j],dp[i][0]);

        3.在当前疲劳值为0时仍进行休息:dp[i][0]=max(dp[i-1][0],dp[i][j]);

    代码如下:

    

#include<bits/stdc++.h>
using namespace std;


int n,m,d[10001],dp[10001][501];


inline void init() {
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%d",&d[i]);
}


inline void work() {
	for (int i=1;i<=n;i++) {
		dp[i][0]=max(dp[i-1][0],dp[i][0]);
		for (int j=1;j<=m;j++) {
			if (i>=j) dp[i][0]=max(dp[i-j][j],dp[i][0]);//此处必须有i>=j,否则会RE
			dp[i][j]=max(dp[i-1][j-1]+d[i],dp[i][j]); 
		}
	}
}


inline void outo() {
	printf("%d\n",dp[n][0]);	
}


int main() {
	init();
	work();
	outo();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/chenkainan1023/article/details/79978486
今日推荐