采用动态规划的思想,可以在一次遍历中完成解答。
依次相加所有的元素,同时记录相加过程中的最大值,当cur的和小于0时,说明此时再加下去会拖累后面元素的后腿,遂舍弃之前的cur,从下一个元素开始重新相加。
#include <iostream>
using namespace std;
int main()
{
int k;
while (cin >> k && k != 0)
{
int s[k];
int cur = 0;
int max = -1;
int from = 0;
int to = 0;
int cur_from = 0;
for (int i = 0;i < k;i++)
{
cin >> s[i];
}
for (int i = 0;i < k;i++)
{
cur += s[i];
if (cur > max)
{
max = cur;
from = cur_from;
to = i;
}
if (cur < 0)
{
cur = 0;
cur_from = i+1;
}
}
if (max >= 0) cout << max << ' ' << s[from] << ' ' << s[to] << endl;
else if (max < 0) cout << 0 << ' ' << s[0] << ' ' << s[k-1] <<endl;
}
}