设数值列表a0,a1 . . . an存放在数组arr[0. . .n]中. sum[0],sum[1],sum[2] . . . .sum[n]为以该下标为终点元素的连续子序列的和的最大值,则sum[i]=max{sum[i-1]+arr[i],arr[i]}
1 package org.xiu68.ch06.ex5; 2 3 public class Ex6_1 { 4 /* 5 * 求和最大的连续子序列 6 */ 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 int[] arr=new int[]{5,15,-30,10,-5,40,10}; 10 int[] arr2=new int[]{10,-11,8,-9,1,2,3,-1,4,5,-7}; 11 computMaxSubSum(arr); //10 -5 40 10 12 computMaxSubSum(arr2); //1 2 3 -1 4 5 13 } 14 15 /* 16 * 依据递推式:sum[i] = max{sum[i-1]+arr[i],arr[i]} 17 */ 18 public static void computMaxSubSum(int[] arr){ 19 if(arr==null || arr.length==0){ 20 System.out.println("最长子序列为0"); 21 return; 22 } 23 int[] sum=new int[arr.length]; //记录以该元素为终点的子序列的和的最大值 24 int[] digitNum=new int[arr.length]; //记录以该元素为终点的子序列的长度 25 int index=0; //记录和最大的连续子序列的最后一个元素下标 26 sum[0]=arr[0]; 27 digitNum[0]=1; 28 int maxSum=arr[0]; //记录最大连续子序列的和 29 30 for(int i=1;i<arr.length;i++){ 31 if(sum[i-1]+arr[i]<arr[i]){ 32 sum[i]=arr[i]; 33 digitNum[i]=1; 34 } 35 else{ 36 sum[i]=sum[i-1]+arr[i]; 37 digitNum[i]=digitNum[i-1]+1; 38 } 39 40 if(maxSum<sum[i]){ 41 maxSum=sum[i]; 42 index=i; 43 } 44 }//for 45 System.out.print("和最大的最长子序列:"); 46 for(int i=index-digitNum[index]+1;i<=index;i++) 47 System.out.print(arr[i]+" "); 48 System.out.println(); 49 System.out.println("和为:"+maxSum); 50 } 51 52 }