题目描述
给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。
输入格式
第一行是一个整数,表示序列的长度 n。
第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai。
输出格式
输出一行一个整数表示答案。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int a[N];
int ans = -INT_MAX;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int cur = a[1]; // 当前子数组和为第一个元素
ans = cur; // 初始化最大子数组和
for (int i = 2; i <= n; i++) {
cur = max(a[i], cur + a[i]); // 如果加入当前元素和更大,则加入当前元素,否则重新开始
ans = max(ans, cur);
}
cout << ans;
return 0;
}
通过维护一个 当前子数组的和 和 最大子数组的和
对于每一个元素,更新当前子数组和 cur:
如果 cur + a[i]
小于 a[i]
,说明当前子数组的和变小了,应该从当前元素开始一个新的子数组,cur = a[i]
。
否则,cur += a[i]
,继续累加当前子数组和。
再更新 ans
为 cur
和 ans
中的较大值