题目 修剪草地
能给个思路或代码吗,想不出来了
请写出你的初始思路。
#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;
}