Ex 6_1 和最大的相连子序列..._第五次作业

设数值列表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 }
View Code

 

posted @ 2017-12-05 20:10  清风☆薰衣草  阅读(235)  评论(0编辑  收藏  举报