BZOJ 1613 Running贝茜的晨练计划
2017.07.17
2017.07.17
奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行$N(1 \le N \le 10,000)$分钟的晨跑。在每分钟的开始,贝茜会选择下一分钟是用来跑步还是休息。 贝茜的体力限制了她跑步的距离。更具体地,如果贝茜选择在第i分钟内跑步,她可以在这一分钟内跑$D_i(1 \le D_i \le 1,000)$米,并且她的疲劳度会增加 1。不过,无论何时贝茜的疲劳度都不能超过$M(1 \le M \le 500)$。如果贝茜选择休息,那么她的疲劳度就会每分钟减少1,但她必须休息到疲劳度恢复到0为止。在疲劳度为0时休息的话,疲劳度不会再变动。晨跑开始时,贝茜的疲劳度为0。 还有,在N分钟的锻炼结束时,贝茜的疲劳度也必须恢复到0,否则她将没有足够的精力来对付这一整天中剩下的事情。 请你计算一下,贝茜最多能跑多少米。
这题一看就做过……在Algorithm103考过……一看就是SB题。
设$f[i][j]$前$i$时间疲劳度为$j$所能跑的最远距离。对于每一个$(i,j)$都可以拿来更新$f[i+1][j+1]$(跑步)和$f[i+j][0]$(休息)。注意边界条件别超了开的数组就可以了。
#include <cstdio>
#include <algorithm>
using namespace std;
int ans,n,m,d[10010],f[10010][510];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",d+i);
for(int i=0;i<=n;++i)
{
for(int j=0;j<=m;++j)
if(f[i][j]||(!j))
{
f[i+1][j+1]=max(f[i+1][j+1],f[i][j]+d[i]);
if(i+j<=n+1) f[i+j][0]=max(f[i+j][0],f[i][j]);
}
f[i+1][0]=max(f[i+1][0],f[i][0]);
}
printf("%d",f[n+1][0]);
return 0;
}