题目描述
输入一个长度为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 2<=n,m<=300000
第二行有n个数,要求在n个数找到最大子序和
输出
一个数,数出他们的最大子序和
样例输入
6 4 1 -3 5 1 -2 3
样例输出
7
提示
来源
#include<bits/stdc++.h>
using namespace std;
long long a[300005],k[300005],maxn=-1,n,m,l=1;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
k[i]=k[i-1]+a[i];
if(i-l==m){
k[i]-=a[l];l+=1;
}
while(a[l]<=0&&l<i){
k[i]-=a[i];l+=1;
}
if(k[i]<0){
k[i]=0;
l=i+1;
}
maxn=max(maxn,k[i]);
}cout<<maxn;
return 0;}