CI19.7-最大连续子段和
2013-07-20 14:05
281 查看
给定一个整型数组a[],计算最大连续子段和。
例子:
输入:(2, -8, 3, -2, 4, -10)
输出:5 连续子段为(3, -2, 4)
思路:
典型的动态规划问题。对于DP,我们要先找到状态,然后再找到递推关系。定义d[i]为以a[i]结尾的最大连续子段和,那么递推关系为:如果d[i - 1] > 0,d[i] = d[i - 1] + a[i];否则d[i] = a[i]。最后的结果为max{d[i], 0 <= i < n}。我们注意到递推式中d[i]只与d[i - 1]有关系,所以可以将O(n)的空间降为O(1)。
例子:
输入:(2, -8, 3, -2, 4, -10)
输出:5 连续子段为(3, -2, 4)
思路:
典型的动态规划问题。对于DP,我们要先找到状态,然后再找到递推关系。定义d[i]为以a[i]结尾的最大连续子段和,那么递推关系为:如果d[i - 1] > 0,d[i] = d[i - 1] + a[i];否则d[i] = a[i]。最后的结果为max{d[i], 0 <= i < n}。我们注意到递推式中d[i]只与d[i - 1]有关系,所以可以将O(n)的空间降为O(1)。
#include <iostream> #include <vector> using namespace std; int MaxSum(const vector<int>& ivec, bool& check) { if (ivec.size() == 0) { check = false; return -1; } check = true; int res = INT_MIN; int sum = ivec[0]; for (int i = 1; i < ivec.size(); ++i) { if (sum > 0) sum += ivec[i]; else sum = ivec[i]; if (res < sum) res = sum; } return res; } int main() { int n, m; vector<int> ivec; while (cin >> n) { while (n--) { cin >> m; ivec.push_back(m); } bool check; int res = MaxSum(ivec, check); if (check) cout << res << endl; else cout << "invalid" << endl; } return 0; }
相关文章推荐
- 最大连续子段和
- (POJ2750)Potted Flower <环形最大连续子段和 线段树单点更新>
- HDU 1003 MAX SUM 最大连续子段和DP
- Haut 1282: ykc想吃好吃的(最大连续子段和,首尾相连)
- 5089: 最大连续子段和
- 最大连续子段和
- HDU - 1024 Max Sum Plus Plus(最大M段连续子段和,详细解释)
- 最大连续子段和(hdu1003)
- HDU 1003 最大连续子段和
- SPOJ 1043 Can you answer these queries I 求任意区间最大连续子段和 线段树
- Problem I: 最大连续子段和问题
- [DP]FJSDFZOJ 1386 最大连续子段和问题
- HDU_5586_Sum(最大连续子段和)
- 2017icpc北京网络赛c题(最大连续子段和)
- 动态规划——最大连续子段和
- POJ 2593(最大2连续子段和)
- poj 2479 最大连续子段和
- 【bzoj5089】最大连续子段和 分块+单调栈维护凸包
- [DP]LIS+LCS+最大连续子段和
- 最大连续子段和