题目链接:点击打开链接
分析:
首先,这道题有几个必须要知道的条件:
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;
}