第2章最大子序列和问题的复杂度为O(Nlog(N))的解法和复杂度为O(N)的解法(有_2的函数):
#include <stdio.h>
int MaxSubSum(int A[], int ledge, int redge)
{
int leftMax = 0, rightMax = 0, MaxSub = 0;
int leftSum = 0, rightSum = 0, leftSubMax = 0, rightSubMax = 0;
int center = 0, i, j;
if (ledge == redge)
{
if (A[ledge] > 0)
return A[ledge];
else
return 0;
}
center = (ledge + redge) / 2;
leftMax = MaxSubSum(A, ledge, center);
rightMax = MaxSubSum(A, center + 1, redge);
for (i = center; i > 0; i--)
{
leftSum += A[i];
if (leftSum > leftSubMax)
leftSubMax = leftSum;
}
for(j = center + 1; j < redge; j++)
{
rightSum += A[j];
if (rightSum > rightSubMax)
rightSubMax = rightSum;
}
MaxSub = leftSubMax + rightSubMax;
MaxSub = (MaxSub > leftMax) ? MaxSub : leftMax;
MaxSub = (MaxSub > rightMax) ? MaxSub : rightMax;
return MaxSub;
}
int MaxSubSequence(int A[], int N)
{
return MaxSubSum(A, 0, N-1);
}
int MaxSubSequence_2(int A[], int N)
{
int i,j;
int sumSeq = 0, maxSum = 0;
for (i = 0; i < N; i++)
{
sumSeq += A[i];
if (sumSeq < 0)
sumSeq = 0;
if (maxSum < sumSeq)
maxSum = sumSeq;
}
return maxSum;
}
int main()
{
int A[8] = {4, -5, 5, -2, -1, 2, 6, -2};
int max1,max2;
max1= MaxSubSequence(A, 8);
max2 = MaxSubSequence_2(A, 8);
printf("the max is : %d \n", max1);
printf("the max is : %d \n", max2);
}