单调队列是对dp有那么一个优化。
对于形如f[x]=g[x]+min或者max(t[x]|b[x]<=x<=i)的方程
这里的min/max中的函数要求是线性与i相关的函数
其中要求b[x]单调不下降 b[1]<=b[2]<=b[3]<=b[4]
b[x]表示一个与f[x]/x有关的函数,g[x]表示一个与x相关的函数
这么类型的用单调队列可以将计算的复杂度优化到O(N)
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <math.h>
#include <list>
using namespace std;
typedef long long ll;
const int maxn=3e5+7;
list<int>q1;
ll sum[maxn];
int main(){
int i,j,k,f1,f2,f3,f4,t1,t2,t3,t4,n,m,T;
// freopen("in.txt","r",stdin);
scanf("%d %d",&n,&m);
memset(sum,0,sizeof(sum));
ll max1=-1;
for(i=1;i<=n;i++){
scanf("%lld",&sum[i]);
max1=max(max1,sum[i]);
sum[i]+=sum[i-1];
}
for(i=1;i<=n;i++){
while(!q1.empty()&&sum[q1.front()]>sum[i]){
q1.pop_front();
}
q1.push_front(i);
while(!q1.empty()&&q1.back()<i-m){
q1.pop_back();
}
if(i>1){
max1=max(max1,sum[i]-sum[q1.back()]);
}
}
printf("%lld\n",max1);
return 0;
}