题意:
给定 N个数的序列, 求一个长度不超过M的和最大子序列
思路:
单调队列优化DP,维护大小不超过M的前缀和递增队列

1 #include <bits/stdc++.h> 2 3 #define rep(i,x,y) for(int i=(x);i<=(y);++i) 4 #define _max(a,b) (a)>(b)? (a):(b) 5 #define _min(a,b) (a)<(b)? (a):(b) 6 7 using namespace std; 8 typedef long long ll; 9 typedef pair<int,int> pii; 10 typedef pair<ll,int> pli; 11 typedef pair<int,ll> pil; 12 typedef pair<ll,ll> pll; 13 14 const int MAXN=3e5+10; 15 int n,m; 16 ll a[MAXN],pr[MAXN]; 17 18 int main(){ 19 cin>>n>>m; 20 rep(i,1,n) scanf("%lld",a+i),pr[i]=pr[i-1]+a[i]; 21 deque<int> q; 22 ll mas=0; 23 q.push_back(0); 24 rep(i,1,n){ 25 while(!q.empty()&&i-q.front()>m){ 26 q.pop_front(); 27 } 28 mas=max(mas,pr[i]-pr[q.front()]); 29 while(!q.empty()&&pr[q.back()]>=pr[i]){ 30 q.pop_back(); 31 } 32 q.emplace_back(i); 33 } 34 cout<<mas; 35 return 0; 36 }