这道题我使用的是一维数组,虽然样例能过,但提交后没有AC,肯定有些地方我处理的不够好,但是用二维数组写起来就方便很多……
二维数组f[i][j]代表前j分钟疲劳值为j时的最大步数,在第i分钟时,奶牛可以跑或者休息,跑的话f[i][j]=f[i-1][j-1]+s[i](当前i分钟时跑步的步数);如果休息那么f[i][j]等于在它之前的疲劳值相差不超过m的一次最大步数即f[i-k][k]
当疲劳值为零时,当前最大步数等于上一分钟最大步数
果然是线性的呀( ⊙ o ⊙ )
代码在这:
#include <bits/stdc++.h>
using namespace std;
int f[10100][510];
int s[10100];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&s[i]);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=min(i,m);++j)
{
f[i][j]=max(f[i][j],f[i-1][j-1]+s[i]);
}
f[i][0]=f[i-1][0];
for(int j=0;j<=m;++j)
{
if(i>=m) f[i][0]=max(f[i-j][j],f[i][0]);
}
}
printf("%d\n",f[n][0]);
return 0;
}