描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。
例如 1,-3,5,1,-2,3
当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6 输入格式 第一行两个数n,m
第二行有n个数,要求在n个数找到最大子序和 输出格式 一个数,数出他们的最大子序和
单调队列模板题。
#include<cstdio>
int a[300010],q[300010];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("1.txt","w",stdout);
int i,j,k,l,m,n,p,x,y,z,hd,tl,ans;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&x);
a[i]=a[i-1]+x;
}
hd=tl=1;
q[1]=0;
ans=-0x3f3f3f3f;
for(i=1;i<=n;i++)
{
if(i-q[hd]>m) hd++;
ans=max(ans,a[i]-a[q[hd]]);
while (a[q[tl]]>=a[i]&&tl>=hd) tl--;
q[++tl]=i;
}
printf("%d\n",ans);
}