码迷,mamicode.com
首页 > 其他好文 > 详细

01-复杂度1. 最大子列和问题(20)

时间:2015-04-27 23:13:05      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

输入格式:

输入第1行给出正整数 K (<= 100000);第2行给出K个整数,其间以空格分隔。

输出格式:

在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:

6
-2 11 -4 13 -5 -2

输出样例:

20
 1 import java.util.Scanner;
 2 
 3 //一个文件中只能有一个共有的类,并且与文件名称一致,大小写注意
 4 public class Main{
 5   // 程序的入口
 6   public static void main(String args[]){
 7       Scanner sc = new Scanner(System.in);
 8       String num = sc.nextLine();
 9       String[] str = sc.nextLine().split(" ");
10       sc.close();
11      
12       
13       int n = Integer.parseInt(num);
14       int[] numArr = new int[n];
15       for(int i=0;i<n;i++){
16           numArr[i] = Integer.parseInt(str[i]);
17       }
18 
19       int result  = maxSumRec(numArr);
20       System.out.print(result);
21       
22   }
23 
24   private static int maxSumRec(int[] a) {
25     // TODO Auto-generated method stub
26     return maxSumRec(a,0,a.length-1);
27   }
28 
29   /**
30    * 求出数组a中的最大子序列和,如果全是负数,返回0
31    * @param a 
32    * @param left 左边界
33    * @param right 右边界
34    * @return 
35    */
36   private static int maxSumRec(int[] a, int left, int right) {
37     //base case
38     if(left == right){
39       if(a[left]>0){
40           return a[left];
41       }else{
42           return 0;
43       }    
44     }
45     
46     int center = (left + right)/2;
47     int maxLeftSum = maxSumRec(a,left,center);
48     int maxRightSum = maxSumRec(a,center+1,right);
49     
50     int maxLeftBorderSum = 0,leftBorderSum = 0;
51     for(int i=center;i>=left;i--){
52         leftBorderSum += a[i];
53         if(leftBorderSum>maxLeftBorderSum){
54             maxLeftBorderSum = leftBorderSum;
55         }
56     }
57     
58     int maxRightBorderSum = 0,rightBorderSum = 0;
59     for(int i=center+1;i<=right;i++){
60         rightBorderSum += a[i];
61         if(rightBorderSum>maxRightBorderSum){
62             maxRightBorderSum = rightBorderSum;
63         }
64     }
65     
66     return max3(maxLeftSum,maxRightSum,maxRightBorderSum+maxLeftBorderSum);
67   }
68   
69   private static int max3(int a, int b, int c) {
70       int max = 0;
71       if(a>b){
72         if(a>c){
73             max = a;
74         }else{
75             max = c;
76         }
77       }else{
78           if(b>c){
79              max = b;
80           }else{
81               max = c;
82           }
83       }
84     return max;
85   }
86   
87 }

评测结果

时间结果得分题目语言用时(ms)内存(kB)用户
4月27日 21:28 答案正确 20 01-复杂度1 Java (javac 1.6.0) 308 24700 liyuhui

测试点

测试点结果用时(ms)内存(kB)得分/满分
0 答案正确 78 10380 4/4
1 答案正确 80 10296 4/4
2 答案正确 122 12704 4/4
3 答案正确 218 13952 4/4
4 答案正确 308 24700 4/4

查看代码

 1 import java.util.Scanner;
 2 
 3 //一个文件中只能有一个共有的类,并且与文件名称一致,大小写注意
 4 public class Main{
 5   // 程序的入口
 6   public static void main(String args[]){
 7       Scanner sc = new Scanner(System.in);
 8       String num = sc.nextLine();
 9       String[] str = sc.nextLine().split(" ");
10       sc.close();
11      
12       
13       int n = Integer.parseInt(num);
14       int[] numArr = new int[n];
15       for(int i=0;i<n;i++){
16           numArr[i] = Integer.parseInt(str[i]);
17       }
18 
19       int result  = maxSumRec4(numArr);
20       System.out.print(result);
21       
22   }
23 
24   private static int maxSumRec4(int[] a) {
25         int maxSum = 0; 
26         int thisSum = 0;
27         for(int j=0;j<a.length;j++){
28           thisSum += a[j];
29           if(thisSum>maxSum){
30              maxSum = thisSum;
31           }else if(thisSum<0){
32             thisSum = 0;
33           }
34         }
35         
36         return maxSum;
37   }
38 }

评测结果

时间结果得分题目语言用时(ms)内存(kB)用户
4月27日 21:38 答案正确 20 01-复杂度1 Java (javac 1.6.0) 281 24764 liyuhui

测试点

测试点结果用时(ms)内存(kB)得分/满分
0 答案正确 77 10380 4/4
1 答案正确 79 10400 4/4
2 答案正确 124 12656 4/4
3 答案正确 199 13896 4/4
4 答案正确 281 24764 4/4

查看代码

01-复杂度1. 最大子列和问题(20)

标签:

原文地址:http://www.cnblogs.com/liyuhui21310122/p/4461441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!