思路
分别从左往右和从右往坐开始求最大连续子序列和,之后枚举一下求最大值即可,这里读入数据不能用cin ,会被T,我是服了。
代码
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=50000+5;
const int INF=0x3f3f3f;
int a[N];
int f[N];//f表示i之前的最大连续子序列的和
int main(){
int T;
cin >> T;
int n;
while(T--){
cin >> n;
int sum=0;//sum表示以当前数为结尾的连续子序列合
f[0]=-INF;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(sum<0)sum=0;
sum+=a[i];
f[i]=max(f[i-1],sum);
}
int ans=-INF;//ans表示i之前的最大连续子序列和
sum=0;
int res=-INF;
for(int i=n;i>1;i--){
if(sum<0)sum=0;
sum+=a[i];
ans=max(ans,sum);
res=max(res,ans+f[i-1]);
}
printf("%d\n",res);
}
}