求和最大的连续子序列

 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 }
View Code

 

posted @ 2017-10-21 20:18  清风☆薰衣草  阅读(135)  评论(0)    收藏  举报