暴力( O(n2) )
int MaxSubseqSum(int A[], int N){
int ThisSum, MaxSum, i, j;
MaxSum = 0;
for (i = 0; i < N; ++i){
ThisSum = 0; // 表示遍历,i表示起始节点,每一次都是新的开始
for (j = i; j < N; ++j){
ThisSum += A[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
// 外层循环表示 i 节点开始的最大子序列
// 内层循环表示当前节点 i 开始的情况下的最大子序列
}
递归 + 分治( O(nlogn) )
分:二分
治:MAX3()
int MaxSubSum(int A[], int Lft, int Rgt){
int MaxLft, MaxRgt, MaxCross;
int MaxLftBorder, MaxRgtBorder;
int LftBorder, RgtBorder;
int Center, i;
if (Lft == Rgt){
if (A[lft] > 0)
return A[lft];
return 0;
}
Center = (Lft + Rgt)/2;
MaxLft = MaxSubSum(A, Lft, Center);
MaxRgt = MaxSubSum(A, Center + 1, Rgt);
MaxLftBorder = 0, LftBorder = 0;
for (i = Center; i >= Lft; --i){
LftBorder += A[i];
if (LftBorder > MaxLftBoder)
MaxLftBorder = LftBorder;
}
MaxRgtBorder = 0, RgtBorder = 0;
for (i = Center + 1; i < Rgt; ++i){
RgtBorder += A[i];
if (RgtBorder > MaxRgtBorder)
MaxRgtBorder = RgtBorder;
}
MaxCross = MaxLftBorder + MaxRgtBorder;
return MAX3(MaxLft, MaxRgt, MaxCross);
}
#define MAX(a, b) ((a) > (b))?(a):(b)
#define MAX3(a, b, c) MAX(MAX(a, b), c)
时间复杂度为 O(n) 的算法
int MaxSubseqSum(int A[], int N){
int ThisSum, MaxSum, j;
ThisSum = MaxSum = 0;
for (j = 0; j < N; ++j){
ThisSum += A[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
else if (ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}