最大子序和

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 Format

第一行两个数n,m

第二行有n个数,要求在n个数找到最大子序和

Output Format

一个数,数出他们的最大子序和

Sample Input

6 4
1 -3 5 1 -2 3

Sample Output

7

Hint

数据范围:

100%满足n,m<=300000

Limitation

各个测试点1s

题解:

  求连续子序列,先求出所有的前缀和,再枚举端点,比较求出最大值即可,记得用单调栈维护即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
int p[523303],s[512303],q[521031];
int main()
{
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
       int h=1,t=1;
       cin>>n>>m;
       for(int i=1;i<=n;i++)
       {
           cin>>p[i];
           s[i]=s[i-1]+p[i];
       }
       for(int i=1;i<=n;i++)
       {
            while(i-q[h]>m)
                   h++;
            ans=max(ans,s[i]-s[q[h]]);
            while(h<=t&&s[q[t]]>s[i])
                t--;
            q[++t]=i;
       }
    cout<<ans<<endl;
    return 0;
}
View Code

  ❀完结撒花❀

posted @ 2021-02-02 17:13  上仙  阅读(73)  评论(0编辑  收藏  举报