最大子序列求和:
A[] = {-7,5,-2,15,1,0,4}
方法1:二分法:
(1).分解成最小子问题
left {-7,5,-2} right {15,1,0} /*1
left {-7,5} right{-2} left{15,1} right {0} /*2
left right {-7} {5} {-2} {15} {1} {0} /*3
left right 同时指向同一个项,这也是下面递归调用的基准情况
int MaxLeftSum ,MaxRightSum ;
int MaxLeftBorderSum,MaxRightBorderSum;
int LeftBorderSum,RightBorderSum;
MaxLeftSum ,MaxRightSum 存放最大值
MaxLeftBorderSum,MaxRightBorderSum 存放横跨边界的最大值。
MaxLeftBorderSum 包含center 的最大和
MaxRightBorderSum 包含center + 1 的最大和
LeftBorderSum 从center 开始到 left 的和
RightBorderSum 从center + 1 开始到 right 的和
int MaxSubsequenceSum( const int A[],int N )
{
return MaxSubSum(A,0,N-1);
}
int Max3( int left,int right,int lr)
{
if(left >= right && left >= lr)
return left;
return Max3(right,lr,left);
}
static int MaxSubSum( const int A[], int Left, int Right )
{
int MaxLeftSum ,MaxRightSum ;
int MaxLeftBorderSum,MaxRightBorderSum;
int LeftBorderSum,RightBorderSum;
int Center,i;
if (Left == Right) //base case//
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);
//left
MaxLeftBorderSum = LeftBorderSum = 0;
for (i = Center; i >= Left ;i--)
{
LeftBorderSum += A[i];
if(LeftBorderSum > MaxLeftBorderSum)
MaxLeftBorderSum = LeftBorderSum;
}
//right
MaxRightBorderSum = RightBorderSum = 1;
for (i = Center + 1; i <= Right ;i++)
{
RightBorderSum += A[i];
if (RightBorderSum > MaxRightBorderSum)
MaxRightBorderSum = RightBorderSum;
}
//返回三者最大值
return Max3(MaxLeftSum, MaxRightSum,
MaxLeftBorderSum + MaxRightBorderSum);
}