最大子序列求和问题(1)-解法之一分治法
2012-05-10 00:21 尔 阅读(198) 评论(0) 收藏 举报(一)问题提出
求序列和的最大值
/** * 求最大序列和 */ public class CMaxSumUtils { /* * 算法一 */ public static int maxSum(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 = maxSum(a, left, center); int maxRightSum = maxSum(a, center + 1, right); /** * 例: * 当子问题为[-1 2],求得以下 * maxLeft=-1,maxRight=2,max横跨左右=-1 + 2 * 当取 3者最大解 */ int maxLeftBorderSum = 0; int leftBorderSum = 0; for(int i = center; i >= left; i--) { leftBorderSum += a[i]; if(leftBorderSum > maxLeftBorderSum) { maxLeftBorderSum = leftBorderSum; } } int maxRightBorderSum = 0; int rightBorderSum = 0; for(int i = center + 1; i <= right; i++) { rightBorderSum += a[i]; if(rightBorderSum > maxRightBorderSum) { maxRightBorderSum = rightBorderSum; } } return max(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum ); } private static int max(int a1, int a2, int a3) { int max = 0; if(a1 > max) { max = a1; } if(a2 > max) { max = a2; } if(a3 > max) { max = a3; } return max; } public static void main(String[] args) { int[] a = {-1, 2, -7, 5}; System.out.println(maxSum(a, 0, a.length - 1)); } }