给定一个整型数列,你需要找到两个连续子段,保证两个子段不能重复,并且使得这两个字段中的所有整数的和最大
//输入
//多少行
//数组长度
//数组值
3
10
1 -1 2 2 3 -3 4 -4 5 -5
5
-5 9 -5 11 20
10
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
//输出
13
40
-2
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define M 10000
int main()
{
int N;
cin >> N;
vector<int>record(M, 0);
vector<int>dp(M, 0);
vector<int>Right(M, 0);
vector<int>Left(M, 0);
while (N--)
{
int i, n = 0;
cin >> n;
for (i = 1; i <= n; i++)
cin >> record[i];
Left[0] = Right[n + 1] = dp[n + 1] = dp[0] = -M;
for (i = 1; i <= n; i++)//正向
{
dp[i] = max(dp[i - 1] + record[i], record[i]);
}
for (i = 1; i <= n; i++)
{
Left[i] = max(Left[i - 1], dp[i]);
}
for (i = n; i >= 1; i--)
{
dp[i] = max(record[i], dp[i + 1] + record[i]);
}
for (i = n; i >= 1; i--)//逆向
{
Right[i] = max(Right[i + 1], dp[i]);
}
int sum = -M;//枚举
for (i = 1; i <= n; i++)
{
sum = max(Left[i] + Right[i + 1], sum);
}
cout << sum << endl;
}
return 0;
}