题意就是两个不重叠的子序列和最大,一开始套循环暴力超时了,然后想求最长子序列,再求最短子序列,发现有重叠情况不成立,所以就分左右两边判断最长和最短子序列了,需要注意这里面子序列长度不能为0,就因为这wa了N次了
#include<iostream>
#include<stdio.h>
#define INT_MIN -10000
using namespace std;
int main(){
int s[100001];
int dp[100001];
int i,t,j,n,temp,c,sum,ans;
cin>>t;
while(t--)
{
cin>>n;
if(n == 0) return 0;
sum = 0;
temp = INT_MIN;
for(i=0; i<n; i++){
scanf("%d",&s[i]);
sum += s[i];
if(sum > temp){
temp = sum;
}
dp[i] = temp;
if(sum < 0){
sum = 0;
}
}
sum = 0;
ans = temp = INT_MIN;
for(i=n-1; i>0; i--){
sum += s[i];
if(sum > temp){
temp = sum;
}
if(dp[i-1] + temp > ans){
ans = dp[i-1] + temp;
}
if(sum < 0 ) sum = 0;
}
cout<<ans<<endl;
}
return 0;
}