PTA PAT甲级 1007 Maximum Subsequence Sum
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e5 + 10;
int a[N], f[N];
int n;
int main()
{
cin >> n;
int res = -1;//最大连续子段和的值
int cs, ct;//当前最大连续字段和左右端点
int fs, ft;//最终最大连续字段和左右端点
cs = ct=1;
bool flag = false;
for (int i = 1;i <= n;i++)
{
scanf("%d", &a[i]);
if (a[i] >= 0)flag = true;
//如果取a[i]后 连续子段和大于0 就可以考虑取
if (f[i - 1] + a[i] > 0)
{
ct = i;
f[i] = f[i - 1] + a[i];
}
else//如果取a[i]后和小于0 那不如从下一个位置重新开始(坚决不取)
{
cs = i + 1;
f[i] = 0;
}
if (res < f[i])//这次算出来的连续区间和更大
{
res = f[i];//更新最大值
fs = cs;ft = ct;//更新左右端点坐标
}
//f[i] = max(0, f[i - 1] + a[i]);
//res = max(res, f[i]);
}
if (flag)cout << res<<' '<<a[fs]<<' '<<a[ft]<<endl;
else {cout << 0<<' '<<a[1]<<' '<<a[n]<<endl;}
return 0;
}
res为最大连续子段和
fs ft 分别对应其左端点右端点的下标