给定整数A1、A2、A3....(整数可能为负),求连续整数∑A的最大值。
}
分析:
(1)分治法算法,将整数组分为两半,最大子序列的和的情况有3种:1】全部在前半部分、2】全部在后半部分、3】开始在前半部分,结束在后半部分。
(2)对于第一种,递归计算前半部分和;第二种递归计算后半部分和;第三种通过两个循环计算从前半部分开始,后半部分结束的最大连续子序列。然后选择其中的最大值。
算法[O(NlogN)]:
public int maxSumRec( int[] a, int left, int right) {
int maxLeftBorderSum = 0, maxRightBorderSum = 0 ;
int leftBorderSum = 0, rightBorderSum = 0 ;
int center = (left + right) / 2 ;
if ( left == right )
return a[left] > 0 ? a[left] : 0 ;
int maxLeftSum = maxSumRec ( a, left, center ) ;
int maxRightSum = maxSumRec ( a, center+1, right ) ;
for ( int i=center; i>=left; i-- ) {
leftBorderSum += a[i] ;
if ( leftBorderSum > maxLeftBorderSum )
maxLeftBorderSum = leftBorderSum ;
}
for ( int i=center+1; i<=right; i-- ) {
rightBorderSum += a[i] ;
if ( rightBorderSum > maxRightBorderSum )
maxRightBorderSum = rightBorderSum ;
}
return max3 ( maxLeftSum, maxRightSum, maxLeftBorderSum+maxRightBorderSum ) ;}