思路:先dp求出左边和右边的最大子序列和。再求出每个位置左边和右边最大的和
#include<bits/stdc++.h>
using namespace std;
int dp1[50001],dp2[50001],a[50001],lmax[50001],rmax[50001];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
dp1[1]=a[1];
lmax[1]=a[1];
dp2[n]=a[n];
rmax[n]=a[n];
for(int i=2;i<=n;i++)
dp1[i]=max(dp1[i-1]+a[i],a[i]);
for(int i=n-1;i>=1;i--)
dp2[i]=max(dp2[i+1]+a[i],a[i]);
for(int i=2;i<=n;i++)
lmax[i]=max(lmax[i-1],dp1[i]);
for(int i=n-1;i>=1;i--)
rmax[i]=max(rmax[i+1],dp2[i]);
int ans=-0x3f3f3f3f;
for(int i=2;i<=n;i++)
ans=max(ans,lmax[i-1]+rmax[i]);
cout<<ans<<endl;
}
}