be[i]记录着i之前最大的子序列之和;en[i]记录着i之后的子序列之和;这两个都可以通过O(n)的便利得到;然后枚举分界点,总体O(n)解决之。
代码:
#include<iostream>
#include<stdio.h>
using namespace std;
int rem[50030];
int be[50030];
int en[50030];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int m;
scanf("%d",&m);
for(int j=0;j<m;j++)
{
scanf("%d",&rem[j]);
}
int r=-1000000;
int mi=-1000000;
for(int j=0;j<m;j++)
{
if(r<0)
{
r=rem[j];
}
else
{
r+=rem[j];
}
mi=max(mi,r);
en[j]=mi;
}
r=-1000000;
mi=-1000000;
for(int j=m-1;j>=0;j--)
{
if(r<0)
{
r=rem[j];
}
else
{
r+=rem[j];
}
mi=max(mi,r);
be[j]=mi;
}
int an=-10000000;
for(int j=0;j<m-1;j++)
{
an=max(an,en[j]+be[j+1]);
}
cout<<an<<endl;
}
return 0;
}