题目描述
对于给定的整数序列,找出两个不重合连续子段,使得两子段中所有数字的和最大。我们如下定义函数 :
我们的目标就是求出 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#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("%dn",ans); } }



