Weiss-(DSAA - in C,2.12)最大子序列求和

来源:互联网 发布:淘宝怎么看卖家信用 编辑:程序博客网 时间:2024/06/13 15:05

最大子序列求和:

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);}




0 0
原创粉丝点击