对每一个点,求它的左边的最大连续子序列和以及右边的最大连续子序列和,取最大值
由于两段区间不连续,对点i,所以max = left[i] + right[i+1];
#include<iostream>
using namespace std;
int main()
{
int t,l[50003],r[50003],num[50003];
scanf("%d",&t);
while(t--)
{
int n,i,j,sum;
scanf("%d",&n);
for(i = 0;i < n;i++)
scanf("%d",num+i);
l[0] = num[0];
for(i = 1;i < n;i++)
if(l[i-1] > 0)
l[i] = l[i-1] + num[i];
else
l[i] = num[i];
for(i = 1;i < n;i++)
if(l[i] < l[i-1])
l[i] = l[i-1];
r[n-1] = num[n-1];
for(i = n-2;i >= 0;i--)
if(r[i+1] > 0)
r[i] = r[i+1] + num[i];
else
r[i] = num[i];
for(i = n-2;i >= 0;i--)
if(r[i] < r[i+1])
r[i] = r[i+1];
int max = INT_MIN;
for(i = 0;i < n-1;i++)
if(max < l[i] + r[i+1])
max = l[i] + r[i+1];
printf("%d\n",max);
}
return 0;
}