#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N];
int main()
{
int n;
while (cin >> n)
{
int f[N]; //f[i]:表示以i结尾的最大子序列和
for (int i = 1 ; i <= n ; i ++ )
cin >> a[i];
//res:最大和,因为有可能是0,所以一开始初始化-1
//l:左端点
//r:右端点
//tmep: 标记
int res = -1, l = 0, r = 0, temp = 0;
for (int i = 1 ; i <= n ; i ++ )
{
//当前i的最大值,可以有前面i - 1的最大值f[i - 1] + a[i] 跟 当前a[i]比较
f[i] = max(f[i - 1] + a[i], a[i]);
//如果前面i - 1个数的最大子序和为0,则前面的数都是负数,都不用取,用temp标记下标
if (f[i - 1] < 0) temp = i - 1;
//每次更新一下最大值,如果当前以i结尾的最大子序和 > res
//更新答案 ,左端点l = temp(标记的点),因为前面的值已经不能取了,左端点就是temp
//右端点是当前的结尾的数的下标
if (f[i] > res) res = f[i], l = temp, r = i - 1;
}
//如果答案是负数,说明最大的子序和都是负数,直接输出000
if (res < 0) printf("0 0 0\n");
else printf("%d %d %d\n",res, l , r); //反之输出最大和 ,左端点下标, 右端点下标
}
}
最大连续子序列
最新推荐文章于 2024-10-01 23:05:47 发布