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

最大子序列求和:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值