[进阶指南] 最大子序和

题意:

给定 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 }
View Code

 

posted @ 2020-07-30 23:44  JNzH  阅读(172)  评论(0编辑  收藏  举报