最大子序列求和模版

long max3(long a, long b, long c) 
{ 
       if (a < b) 
            a = b;
       if (a > c)
              return a;
       else
              return c;
}
long maxSumRec(const vector<int>& a, int left, int right) 
{ 
       if (left == right) 
       { 
              if (a[left] > 0) 
                     return a[left]; 
              else 
                     return 0; 
       }
       int center = (left + right) / 2; 
       long maxLeftSum = maxSumRec(a, left, center); 
       long maxRightSum = maxSumRec(a, center+1, right); 
       //求出以左边对后一个数字结尾的序列最大值 
       long maxLeftBorderSum = 0, leftBorderSum = 0; 
       for (int i = center; i >= left; i--) 
       { 
              leftBorderSum += a[i]; 
              if (leftBorderSum > maxLeftBorderSum) 
                     maxLeftBorderSum = leftBorderSum; 
       } 
       //求出以右边对后一个数字结尾的序列最大值 
       long maxRightBorderSum = 0, rightBorderSum = 0; 
       for (int j = center+1; j <= right; j++) 
       { 
              rightBorderSum += a[j]; 
              if (rightBorderSum > maxRightBorderSum) 
                     maxRightBorderSum = rightBorderSum; 
       } 
 
       return max3(maxLeftSum, maxRightSum,  
              maxLeftBorderSum + maxRightBorderSum); 
} 
long maxSubSum3(const vector<int>& a) 
{ 
       return maxSumRec(a, 0, a.size()-1); 
}
分治法 O(NlogN)

 

转载于:https://www.cnblogs.com/Noevon/p/5657215.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值