注意点:
最大子序列的和,又要选取序号最小的。和为0的与和为负数的要分开来考虑。
题中数据好像没有给出以下情况例子
1 -1 2 2 3 -1
这个结果应该是
(1) 7 1 3
(2) 7 2 3
两种算法都能通过。按照题意应该是(1)
代码:
#include<iostream>
using namespace std;
int main()
{
int a[10005], s[10005];
int n, i, j, max, sum;
int left, right;
cin >> n;
for (i = 0; i < n; i++)
cin >> a[i];
max = 0;
s[n] = 0;
for (i = n - 1; i >= 0; i--)
{
s[i] = a[i] + s[i + 1];
if (s[i] < 0)
s[i] = 0;
}
for (i = 0; i < n; i++)
if (max < s[i])
{
max = s[i];
left = i;
}
if (max == 0)
{
for (i = 0; i < n;i++)
if (a[i] == 0)
{
cout << "0 0 0" << endl;
return 0;
}
cout << "0 " << a[0] << " " << a[n - 1] << endl;
return 0;
}
sum = a[left];
right = left;
while (sum < max)
{
right++;
sum += a[right];
}
cout << max << " " << a[left] << " " << a[right] << endl;
return 0;
}