/*
这种代码就给我一种很巧妙的感觉,从这些代码中能学到很多,
将sum初始值赋为-1,看数列中是否存在0;
将rightindex变为n-1,方便最后的输出
这两点是我没有想出来的,导致程序一直存在几个样例过不去
直接把题解上的代码传上来了,这道题能学到很多细节处理方面的东西
/*
这种代码就给我一种很巧妙的感觉,从这些代码中能学到很多,
将sum初始值赋为-1,看数列中是否存在0;
将rightindex变为n-1,方便最后的输出
这两点是我没有想出来的
*/
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
scanf("%d", &n);
vector<int> v(n);
int leftindex = 0, rightindex = n - 1, sum = -1, temp = 0, tempindex = 0;
//动态规划问题,如果左侧为负值则不肯能对后面的加和有正向的影响,所以赋值为0
for (int i = 0; i < n; i++)
{
scanf("%d", &v[i]);
temp = temp + v[i];
if (temp < 0)
{
temp = 0;
tempindex = i + 1;
}
//如果temp>sum更新最大值和下表位置
else if (temp > sum)
{
sum = temp;
leftindex = tempindex;
rightindex = i;
}
}
//序列中全是负数的情况
if (sum < 0)
sum = 0;
printf("%d %d %d", sum, v[leftindex], v[rightindex]);
return 0;
}