//============================================================================ // Name : maxSubArraySum.cpp // Author : 齐保元 // Version : // Copyright : Your copyright notice // Description : 求一个数组的子数组的最大的和 //============================================================================ #include <iostream> using namespace std; /** * 两者的最大值 */ int max(int x, int y) { return (x > y) ? x : y; } /** * 求一个数组的子数组的最大的和 * @description:动态规划(将N规模的降低到N-1) * @detail:假设已经知道(A[1],A[2]...A[n-1])中和最大的一段之和为All[1],且知道(A[1],A[2]...A[n- 1]) * 包含A[1]的和最大的一段和为Start[1],那么ALL[0]=max(A[0],A[0]+Start[1],All[1]);符合动态规划的 * 无后效性,可以使用动态规划 */ int maxSum(int* A, int n) { int nStart = A[n - 1]; int nAll = A[n - 1]; for (int i = n - 2; i > -0; i--) { nStart = max(A[i], nStart + A[i]); nAll = max(nStart, nAll); } return nAll; } int main() { int A[] = { 1, -2, 3, 5, 5, 9, -3, -2 }; int sum = maxSum(A, sizeof(A) / sizeof(A[0])); cout << sum << endl; return 0; }