f[i]=max{f[j]+sum[i]-sum[j+1]} (i-j-1<=k)
这个式子可以用单调性来优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include<bits/stdc++.h> #define FILE "read" #define MAXN 100010 using namespace std; typedef long long ll; ll n,k,head,tail,a[MAXN],sum[MAXN],f[MAXN],q[MAXN]; inline int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();} return x*f; } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); n=read(); k=read(); for(int i=1;i<=n;++i) a[i]=read(),sum[i]=sum[i-1]+a[i]; for(int i=1;i<=n;++i){ while(head<tail&&i-q[head]-1>k) ++head; if(i<=k) f[i]=sum[i]; else f[i]=f[q[head]]+sum[i]-sum[q[head]+1]; while(head<tail&&f[i]-sum[i+1]>=f[q[tail]]-sum[q[tail]+1]) --tail; q[++tail]=i; } printf("%lld\n",f[n]); return 0; }
|
本文标题:【bzoj2442】修剪草坪
文章作者:chty
发布时间:2017年04月05日 - 20时23分
最后更新:2018年03月02日 - 17时26分
许可协议:本文为博主原创,未经许可不得转载。