最大子序和 单调队列

匿名 (未验证) 提交于 2019-12-02 23:49:02

最大子序和

Time Limit: 1 Sec Memory Limit: 256 MB

Description

输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6。

Input

第一行两个数n,m(1<=n,m<=300000) 第二行有n个数,要求在n个数找到最大子序和。

Output

一个数,即最大子序和S(S值不超过long long int)。

Sample Input

6 4

1 -3 5 1 -2 3

Sample Output

7

分析:

所以只需要枚举j,并找到每段区间中的最小值s[i]即可

int n,m; cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&a[i]),s[i] = s[i-1] + a[i]; //s[i] = a[1] + ... + a[i];  int l = 1,r = 1; // 维护队列左右边界  q[l] = 0;//q 单调队列 存下标   ans = -0xfffffff;// ans初始化为极小值 for(int i=1;i<=n;i++) {     while(l<=r && q[l]<i-m) l++;     ans = max(ans,s[i] - s[q[l]]);     while(l<=r && s[q[r]]>s[i]) r--;     q[++r] = i; }      printf("%lld",ans);

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!