package com.wentora.exercise; /** * 求最大子段和 * 递归求解 * 动态规划求解 * 思想:最大的子段和必是数组中以某一元素为最后元的最大子段和,因此定义递归函数表示为以第i个元素为 * 最后元的最大子段和,它可以由如下递归式得到:当函数(i-1)大于0时,函数(i)=函数(i-1)+a[i] * 当函数小于0时,函数(i)=a[i] * 动态规划思路则是自底向上依次求解函数(i) * @author wentora */ import java.util.Scanner; public class MaxSubStringSum { private int[] a; int[] b; MaxSubStringSum(int[] a) { this.a = a; b = new int[a.length + 1]; b[0] = -10000; } public int getEndWithIndexMaxSum(int index) { if(index == 0) return a[0]; if(getEndWithIndexMaxSum(index - 1) > 0) return getEndWithIndexMaxSum(index - 1) + a[index]; else return a[index]; } public void dynamic(int length) { for(int i = 1; i <= length; i++) { if(b[i - 1] > 0) b[i] = b[i - 1] + a[i - 1]; else b[i] = a[i - 1]; } } public int getMax() { int max = -10000; for(int i = 1; i <= a.length; i++) { if(max < b[i]) max = b[i]; } return max; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int length; System.out.println("please input length : "); length = in.nextInt(); int[] a = new int[length]; System.out.println("please input array : "); for(int i = 0; i < length; i++) a[i] = in.nextInt(); MaxSubStringSum msss = new MaxSubStringSum(a); int max = -10000; for(int i = 0; i < length; i++) { if(msss.getEndWithIndexMaxSum(i) > max) max = msss.getEndWithIndexMaxSum(i); } System.out.println("the max subString sum by recursion is : " + max); msss.dynamic(length); System.out.println("the max subString sum by dynamic is : " + msss.getMax()); } }