DP做法。
f[i]表示以ai结尾的最大子段和,易得f[i] = max(ai, f[i - 1] + ai).O(n)求解
#include <bits/stdc++.h>
using namespace std;
int n, f[200010] = {-0x3f3f3f3f}, ans = -0x3f3f3f3f;
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) {
int x; cin >> x;
f[i] = max(x, f[i - 1] + x);
ans = max(ans, f[i]);
}
cout << ans;
}
贪心做法
扫描该数列,不断把新的数加入子段,当子段和为负数,清空子段,扫描过程中出现的最大值即为答案。
#include <bits/stdc++.h>
using namespace std;
int n, ans = -0x3f3f3f3f, sum = 0;
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) {
int x; cin >> x;
sum += x;
ans = max(ans, sum);
if (sum < 0) sum = 0;
}
cout << ans;
}