分析:和上一题差不多,首先引入一个数m,m是在t1和s2之间的一个数,简单讲就是把序列分成两部分,然后两部分分别求最大子序列和,左边部分的最大子序列和为l(i),右边部分的最大子序列和为r(i)。那么问题变成了。
d(A) = max{ l(m)+r(m+1), 1<=m<=n }
Code
#include <iostream>
using namespace std;
int a[50001],l[50001],r[50002];
int main()
{
int t,n,sum,max;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
l[0] = -10001;
sum = 0;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
if(l[i-1] > a[i]+sum)
l[i]=l[i-1];
else
l[i]=a[i]+sum;
sum+=a[i];
if(sum<0)
sum=0;
}
r[n+1] = -10001;
sum = 0;
max = -200000;
for(int i=n;i!=0;--i)
{
if(r[i+1] > a[i]+sum)
r[i]=r[i+1];
else
r[i]=a[i]+sum;
sum+=a[i];
if(sum<0)
sum=0;
if(l[i]+r[i+1]>max)
max = l[i]+r[i+1];
}
printf("%d\n",max);
}
return 0;
}