最大子序列和问题的解——C++实现;
2016-03-31 00:00
435 查看
摘要: 给定整数A1,A2,...,An,求子序列的最大值。
此程序经visual studio 2013运行无误。
此程序的运行时间为O(N)。
运行结果为
此程序经visual studio 2013运行无误。
此程序的运行时间为O(N)。
#include <vector> #include <iostream> using namespace std; //线性算法 int maxSubSum1(const vector<int>& a) { int maxSum, thisSum, i = 0; if (a[0] < 0) { maxSum = a[0]; i++; while (i < a.size()) { if (a[i] < 0) { maxSum = (maxSum > a[i] ? maxSum : a[i]); i++; } else break; } } if (i < a.size()) { maxSum = a[i]; thisSum = a[i]; i++; while (i < a.size()) { if (a[i] > 0) { if (thisSum > 0) { thisSum += a[i]; maxSum = (maxSum > thisSum ? maxSum : thisSum); i++; } else { thisSum = a[i]; maxSum = (maxSum > thisSum ? maxSum : thisSum); i++; } } else { if (thisSum > 0) { if (thisSum + a[i] < 0) { thisSum = a[i]; i++; } else { thisSum += a[i]; i++; } } else { thisSum += a[i]; i++; } } } return maxSum; } else { return maxSum; } } //穷举算法 时间复杂度为N的平方 int maxSubSum2(const vector<int>& a) { int maxSum = a[0], thisSum; for (int i = 0; i < a.size(); i++) { thisSum = 0; for (int j = i; j < a.size(); j++) { thisSum += a[j]; maxSum = (maxSum > thisSum ? maxSum : thisSum); } } return maxSum; } //验证函数 int main() { vector<int> a = { 4, -3, 5, -2, -1, 2, 6, -2};//放入任意int数据 cout << maxSubSum1(a) << endl << maxSubSum2(a) << endl; cin.get(); return 0; }
运行结果为