琪露诺【单调队列优化DP】

琪露诺
发现决策一定单调不下降,于是单调队列优化即可

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N=400000+50;
int a[N],q[N],f[N],head=1,tail=1,p;
int n,l,r;
int ans=0;
inline int read(){
	int cnt=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)){cnt=(cnt<<1)+(cnt<<3)+(c^48);c=getchar();}
	return cnt*f;
}
signed main(){
	n=read(),l=read(),r=read();
	for(int i=0;i<=n;++i){a[i]=read();}
	memset(f,0xcf,sizeof(f));
	ans=f[0];f[0]=0;p=0;
	for(int x=l;x<=n;++x){
		while(head<=tail&&f[q[tail]]<=f[p]){tail--;}
		q[++tail]=p;
		while(q[head]+r<x){++head;}
		f[x]=f[q[head]]+a[x];
		++p;
	}
	for(int x=n+1-r;x<=n;++x){ans=max(ans,f[x]);}
	printf("%d",ans);
	return 0;
}

你可能感兴趣的:(动态规划,单调队列)