题目描述:
数组中子段的最大总和。
例如,1 2 3 -5 4 3 -6 中的最大子段总和是 1 + 2 + 3 +( - 5)+ 4 + 3 = 8
输入格式:
第一行一个整数 nn。(1≤n≤100000)(1≤n≤100000)
第二行 nn 个整数 aiai。(−10000≤ai≤10000)(−10000≤ai≤10000)
输出格式:
一个整数表示最大子段和
贪心思想,非常重要!
我们首先要明确贪心的过程:两个变量,sum表示某个区间的区间和 ,mx表示sum每个形态 中的最大值。贪心思想为sum初始值为0,一直累加a[i],并用mx记录下sum的最大值,如果sum小于0,就重新开始,因为负数加上一个数不如0加上那个数,当然我们必须要注意,在输入数组全部为负数的时候,输出最大(距离0最近)的负数。
cpp#include <bits/stdc++.h> using namespace std; int main() { int n, mx = 0x80000000, a[100005]; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; mx = max(mx, a[i]); // 临时记录下最大值 } if (mx < 0) { cout << mx << endl; // 如果全部为负数,输出离0最近的数。 return 0; } mx = 0x80000000; // 重新初始化,新的意义为sum的最大形态 int sum = 0; for (int i = 1; i <= n; i++) { mx = max(mx, sum); // 更新 sum += a[i]; // 累加 if (sum < 0) // 当sum < 0,就把区间的左边更新,一切重新开始 sum = 0; } cout << mx << endl; return 0; }
感谢阅读,如有错误或者建议请在评论区指出,进入我主页探索更多算法知识!