二刷提高课,题解目录在这里— 提高课的题解目录
单调队列优化是在枚举集合时防止我们多次重复枚举不需要的数据
而DP是一种思想,一种将状态进行集合划分的思想,单调队列DP就是二者结合
减少了我们DP转移过程中的重复计算
这题没必要用数组保存,直接取最大值即可
#include<iostream>
using namespace std;
const int N=3e5+10;
int s[N];
int q[N];
int n,m,res=-1e9;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>s[i],s[i]+=s[i-1];
int hh=0,tt=0;
//这里是前缀和,所以零是有意义的,当由于t的++代替了0会导致前缀和计算错误
for(int i=1;i<=n;i++)
{
while(hh<=tt&&q[hh]<i-m)hh++;
while(hh<=tt&&s[q[tt]]>=s[i])tt--;
res=max(res,s[i]-s[q[hh]]);
q[++tt]=i;
//注意这里需要先判断在将i加进去
//因为有可能s[i]比其他的都要小,然后变成了在hh的位置导致了子序列长度为0
}
cout<<res;
return 0;
}