给定整数A1, A2, A3, A4, ----AN(可能有负数),求Sum = Ai + Ai+1+-----+Aj;求Sum最大值,若所有整数均为负数,则Sum= 0;
法1:O(N^3)
int MaxSubSequenceSum(const int A[], int N ) { int ThisSum, MaxSum, i, j, k; MaxSum = 0; for(i = 0; i < N; i++) for(j = i; j < N; j++) { ThisSum = 0; for(k = i; k <= j; k++) ThisSum += A[ k ]; if(ThisSum > MaxSum) MaxSum = ThisSum; } return MaxSum; }
法2:O(N^2)
int MaxSubSequenceSum(const int A[], int N ) { int ThisSum, MaxSum, i, j, k; MaxSum = 0; for(i = 0; i < N; i++) { ThisSum = 0; for(j = i; j < N; j++) { ThisSum += A[ j ]; if(ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; }
法3:O(NlgN)
int MaxSubSequenceSum(const int A[], int N ) { return MaxSubSum(A, 0, N - 1); } int MaxSubSum(const int A[ ], int Left, int Right) { int MaxLeftSum, MaxRightSum; int MaxLeftBorderSum, MaxRightBorderSum; int LeftBorderSum, RightBorderSum; int center, i; if(Left == Right) { if(A[ Left ] > 0) return A[Left]; else return 0; } center = (Left + Right) / 2; MaxLeftSum = MaxSubSum(A, Left, center); MaxRightSum = MaxSubSum(A, center + 1, Right); MaxLeftBorderSum = 0, LeftBorderSum = 0; for(i = center; i >= Left; i--) { LeftBorderSum += A[i]; if(LeftBorderSum > MaxLeftBorderSum) MaxLeftBorderSum = LeftBorderSum; } MaxRightBorderSum = 0; RightBorderSum = 0; for(i = center + 1; i <= Right; i++) { RightBorderSum += A[i]; if(RightBorderSum > MaxRightBorderSum) MaxRightBorderSum = RightBorderSum; } return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum); } int Max3(int a, int b, int c) { if(a < b) a = b; if(a < c) a = c; return a; }
法4:O(N)
int MaxSubSequenceSum(const int A[], int N ) { int ThisSum = 0, MaxSum = 0, j = 0; for(j = 0; j < N; ++j) { ThisSum += A[ j ]; if(ThisSum > MaxSum) MaxSum = ThisSum; else if(ThisSum < 0) ThisSum = 0; } return MaxSum; }