最大子段和
题目链接:P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
https://www.luogu.com.cn/problem/P1115
输入:
7
2 -4 3 -1 2 -4 3
输出:
4
思路:
本题的目的在于求出一段子序列,使得该子序列之和最大。
我们用res来保存当前子序列和。
一开始我们让第一个元素为一个有效子序列,即res=a[1]
然后从头遍历序列每一个元素:
如果res+a[i]小于a[i], 那么a[i]单独成为新的子序列;
否则该子序列新增a[i]这一个元素。
在遍历每一个元素的过程中,我们用ans来存储所有出现子序列之和的最大值。
AC代码:
#include <iostream>
using namespace std;
int const N = 200010;
int a[N];
int ans = -1e8;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int res = a[1], idx = 1;
for (int i = 2; i <= n; i++)
{
if (res + a[i] < a[i])
{
idx = i;
res = a[i];
}
else {
res += a[i];
}
ans = max(ans, res);
}
cout << ans << endl;
return 0;
}