c++ 修剪草地 提问 ++c

问题遇到的现象和发生背景

题目 修剪草地

img

能给个思路或代码吗,想不出来了

请写出你的初始思路。

#include<iostream>
#include<cstdio>
using namespace std;
long long int f[100005][2];
long long int s[100005];
long long int q[100005];
int main()
{
    int n,k;
    int x;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        s[i]=s[i-1]+x;
    }
    int h=1;
    int t=1;
    for(int i=1;i<=n;i++)
    {
        f[i][0]=max(f[i-1][0],f[i-1][1]);
        while(q[h]<i-k&&h<=t)h++;
        f[i][1]=f[q[h]][0]-s[q[h]]+s[i];
        while(f[i][0]-s[i]>f[q[t]][0]-s[q[t]]&&h<=t)t--;
        q[++t]=i;
    }
    cout<<max(f[n][0],f[n][1])<<endl;
    return 0;
}