1、解释:分治策略。
最大子序列只可能出现在三处。输入数据左半部、输入数据右半部、跨越输入数据中部从而位于左右两半部之中
数组:[4,-3,5,-2,-1,2,6,-2]
分:[4,-3,5,-2] [-1,2,6,-2]
治:左部最大的子序列和maxLeftSum为6(A1-A3),
右部做大的子序列和maxRightSum为7(A5-A7),
左部包含最后元素最大子序列和maxLeftBorderSum为4(A1-A4),
右部包含第一个元素的最大子序列和maxRightBorderSum为7(A5-A7)。
最后求最大的子序列和max(maxLeftSum,maxRightSum,(maxLeftBorderSum+maxRightBorderSum))
2、代码
package com;
public class MaxSequenceFunction {
private static int maxSumRec(int[] a,int left,int right){
if(left==right)
if(a[left]>0)
return a[left];
else
return 0;
int center=(left+right)/2;
int maxLeftSum=maxSumRec(a,left,center);
int maxRightSum=maxSumRec(a,center+1,right);
int maxLeftBorderSum=0,leftBorderSum=0;
for(int i=center;i>=left;i--){
leftBorderSum+=a[i];
if(leftBorderSum>maxLeftBorderSum){
maxLeftBorderSum=leftBorderSum;
}
}
int maxRightBorderSum=0,rightBorderSum=0;
for(int i=center+1;i<=right;i++){
rightBorderSum+=a[i];
if(rightBorderSum>maxRightBorderSum){
maxRightBorderSum=rightBorderSum;
}
}
return Math.max(Math.max(maxLeftSum, maxRightSum),maxLeftBorderSum+maxRightBorderSum);
}
public static void main(String[] args) {
int[] a={4,-3,5,-2,-1,2,6,-2};
int sum=maxSumRec(a, 0, a.length-1);
System.out.println("最大子序列和:"+sum);
}
}
3、代码图解:递归真的不太好理解,个人认为。觉得最好可以有一个例子,画一个图好理解点
个人理解,仅供参考,欢迎指错。