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