题目描述
对于给定的整数序列,找出两个不重合连续子段,使得两子段中所有数字的和最大。我们如下定义函数 :
我们的目标就是求出 d(A)。
输入格式
第一行是一个整数 T(≤30),代表一共有多少组数据。
接下来是 T 组数据。
每组数据的第一行是一个整数,代表数据个数据 n(2≤n≤50000) ,第二行是 n 个整数。
输出格式
输出一个整数,就是 d(A) 的值。
样例
样例输入
复制1
10
1 -1 2 2 3 -3 4 -4 5 -5
样例输出
复制13
样例解释
就是求最大子段和问题,样列取和,Baidu搜POJ 2479 Maximum sum,可获得大量经典最大子段和问题的题目解析,本题算法超时,必须用算法。
数据范围与提示
【来源】
一本通在线评测
不多说,上代码咯!!!!!!!!!!
#include<bits/stdc++.h>
#define LL long long
const int N=5e4+5;
using namespace std;
int a[N],b[N],c[N];
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(a,0,sizeof a);
memset(b,0,sizeof b);
memset(c,0,sizeof c);
int n,ans=-1e9;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[0]=-1e9;
int sum=0;
for(int i=1;i<=n;i++){
b[i]=max(b[i-1],sum+a[i]);
sum+=a[i];
if(sum<0) sum=0;
}
c[n+1]=-1e9;
sum=0;
for(int i=n;i>0;i--){
c[i]=max(c[i+1],sum+a[i]);
sum+=a[i];
if(sum<0) sum=0;
ans=max(ans,b[i]+c[i+1]);
}
printf("%d\n",ans);
}
}