题目:
输入一个长度为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个数找到最大子序和
一个数,数出他们的最大子序和
6 4
1 -3 5 1 -2 3
7
100%满足n,m<=300000
我的代码:
#include<cstdio>
using namespace std;
long long n,m;
long long a[300010];
long long f[300010];
long long step[300010];
long long max(long long a,long long b){
return (a>b)?a:b;
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
f[i]=a[i];
step[i]=1;
}
long long maxx=-0x7fffffff;
for(long long i=1;i<=n;i++){
if(f[i-1]>0){
f[i]+=f[i-1];
step[i]+=step[i-1];
}
if(step[i]>m){
step[i]--;
f[i]-=a[i-step[i]];
}
if(f[i]>maxx){
maxx=f[i];
}
}
printf("%lld",maxx);
return 0;
}