描述
输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。
例如 1,-3,5,1,-2,3
当m=4时,S=5+1-2+3=7
当m=2或m=3时,S=5+1=6
【题目分析】
用单调队列维护一下最优决策。算是一道简单的模板题目。
【代码】
#include <cstdio>
struct node{
int v; //value
int u; //下标
}lin[300001];
int answer=-100000;
int sn=0;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int head=1,tail=2;
scanf("%d",&sn);
lin[1].v=sn;
lin[1].u=1;
answer=sn;
for (int i=2;i<=n;i++){
int x;
scanf("%d",&x);
sn+=x;
while (lin[tail-1].v>=sn&&tail-1>=head) tail--;
lin[tail].v=sn;
lin[tail].u=i;
tail++;
while (i-lin[head].u>m) head++;
if (sn-lin[head].v>answer) answer=sn-lin[head].v;
}
printf("%d\n",answer);
return 0;
}