Wpgwhpg

Posted by xzt on April 29, 2019

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

2.png

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*/