简单DP,时间复杂度必须是O(n),要不然肯定会T。
#include <iostream>
#include <cstdio>
#include <string.h>
#define maxn 10005
using namespace std;
int main()
{
int tot;long long aa[50020],bb[50020],cc[50020];
scanf("%d",&tot);getchar();
while(tot--)
{
long long tttt=-maxn;
memset(bb,maxn*(-1),sizeof(bb));
memset(cc,maxn*(-1),sizeof(cc));
long long int xx,sum=0;int tt;
scanf("%d",&tt);
for(int i=0;i<tt;i++)
{
scanf("%lld",&aa[i]);
if(i==0)
bb[0]=aa[0];
if(i>0)
bb[i]=max(bb[i-1]+aa[i],aa[i]);
}
cc[tt-1]=aa[tt-1];
for(int i=tt-2;i>=0;i--)
cc[i]=max(cc[i+1]+aa[i],aa[i]);
for(int i=1;i<tt;i++)
bb[i]=max(bb[i],bb[i-1]);
for(int i=tt-2;i>=0;i--)
cc[i]=max(cc[i],cc[i+1]);
for(int i=0;i<tt-1;i++)
{
if(tttt<bb[i]+cc[i+1])
tttt=bb[i]+cc[i+1];
}
printf("%lld\n",tttt);
}
}