题目描述
给定一个整数序列,你需要找到两个连续子段,保证这两个子段不能重叠,并且使得这两个子段中
所有整数的和最大。
输入描述
包含一系列的测试用例,
第1行是一个整数,表示测试用例的总数t,(1<=t<= 30)。
每个测试用例包括3行:
第1行是个整数, 表示该整数序列的长度n,(2 <= n <= 5000);
第2行是一个包含n个整数的序列: d1, d2, ……dn, (|di|<= 10000)
输出描述
每个测试用例的输出包括1行, 即该测试用例的最大子段和,
样例输入
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
提示
在第1个测试用例中,我们选择的两个子段分别是: (2.2.3.-3. 4)和(5)。
对于较大的输入序列,我们推荐使用scanf_s或scanf函数。
源代码
#include <iostream>
using namespace std;
int maxsum(const int a[], int m, int n);
int main()
{
int t, n, data[5001];
cin >> t;
while (t--)
{
int sum0, sum1, ans, max = -20001;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> data[i];
}
for (int i = 2; i < n; i++)
{
sum0 = maxsum(data, 1, i);
sum1 = maxsum(data, i + 1, n);
ans = sum0 + sum1;
if (ans > max) max = ans;
}
cout << max << endl;
}
}
int maxsum(const int a[], int m, int n)
{
int temp = -10001;
int max = -20002;
for (int i = m; i <= n; i++)
{
temp = (temp + a[i]) > a[i] ? (temp + a[i]) : a[i];
if (temp > max) max = temp;
}
return max;
}