Inscription
长久以来,
我也想过换一种方式去爱这个世界。
以热烈,以冷漠,或以让别人满意为准。
但总觉得不妥,
那不是真正的我。
Background
“身体是革命的本钱”,gryz每天都会进行游行般的跑操,当然跑操是小事儿,最
重要的还是每周两节61级一班一节都不能少的体育课。
上体育课每次都要跑一大圈进行热身,在某一天老师看不惯了一个人,那个人竟
然是上题中为lyk收拾残局的wpgwhpg,老师可能见他长得太可爱
所以奖励他以后每节体育课他都要跑圈,直到下课
所以,他只能认栽,自我安慰道:唉这是培养我运动细胞啊!
Description
假如,有一天只有体育老师来上课,那么必然要一直上体育,所以上课N分钟, 就
要跑N分钟。但是他的体力有限,他有时候跑,有时候偷懒。他选择在第i分钟
跑,那么在这一分钟内他可以跑S米。假设他有疲劳度,且他每跑一分钟疲劳
就会增加1,当然疲劳度是有上限M的。
“人是有惯性”。如果他决心要休息,那么就要休息到底(即疲劳度一直恢复到0)
每分钟疲劳度就会减 ,他的初始疲劳度为0。
“事情要做完,不能影响接下来的工作”。
也就是说当他跑完N分钟时,他的疲劳度也要恢复到0(疲劳度不能为负数)
他想请你帮他算一下,他最多能跑多少米?
Input Output
Input
第一行两个整数N和M
接下来N+1行,每一行一个整数S
Output
一行,一个整数,即他能跑的最大距离
Input Sample
5 3
5
3
5
2
8
Output Sample
10
Data Range
Code+Solution
//f[i][j]就是第is时wpgwhpg的疲劳度是j,那么我们就可以就ta这1s是否休息进行讨论
#include<bits/stdc++.h>
using namespace std;
const int M = 11000;
int n,m;
int a[M],f[M][510];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
{
if(i+j<=n)//判断越界,不能在n秒内恢复为0
f[i+j][0]=max(f[i+j][0],f[i-1][j+1]);//这里是指恢复体力,不走路所以距离不变,恢复后所走的 路是之前所走的距离
if(j==0)
f[i][j]=max(f[i][j],f[i-1][0]);//这里是指疲劳度为0的时候,他休息的情况可能是上一秒在休息,这一秒也在休息
else
f[i][j]=max(f[i][j],f[i-1][j-1]+a[i]);//如果选择走的话,疲劳度增加1点,第is所走的距离就应该是上f[上1秒][每1秒的疲劳度]+这1s能走的距离
}
cout<<f[n][0]<<endl;
return 0;
}
/*
3
3
2
10*/