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

给定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

查看代码

时间: 2024-10-13 11:31:27

01-复杂度1. 最大子列和问题(20)的相关文章

数据结构练习 01-复杂度1. 最大子列和问题(20)

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

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

01-1. 最大子列和问题(20) 给定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)

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

给定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个整数,其间以空格分隔

复杂度_最大子列和问题(1)

给定K个整数组成的序列{ N1??, N2??, ..., NK},"连续子列"被定义为{ Ni??, Ni+1??, ..., Nj},其中 1≤i≤j≤K."最大子列和"则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编写程序,计算给定整数序列的最大子列和. 本题旨在测试各种不同的算法在各种数据情况下的表现.各组测试数据特点如下: 数据1:与样

复杂度1. 最大子列和问题

给定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个整数,其间以空格分隔

最大子列和问题(20)

输入格式: 输入第1行给出正整数 K (<= 100000):第2行给出K个整数,其间以空格分隔. 输出格式: 在一行中输出最大子列和.如果序列中所有整数皆为负数,则输出0. 输入样例: 6 -2 11 -4 13 -5 -2 输出样例: 20 最大子列和的算法很多,最简单的可以用三重循环来做,不过O(N^3)的时间复杂度... MOOC里陈越姥姥提到的最优算法在线搜索的时间复杂度是O(N) 下面贴出代码 #include <iostream> using namespace std;

MOOC 01-复杂度1 最大子列和问题

#include<stdio.h> int main(){ int result = 0,thissum = 0, N, digit; scanf("%d", &N); for(int i = 0; i < N; i++){ scanf("%d", &digit); thissum += digit; if(thissum > result) result = thissum; if(thissum < 0) thiss

最大子列和问题(剑指offer和PAT)

01-复杂度1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N_1N?1??, N_2N?2??, ..., N_KN?K?? },“连续子列”被定义为{ N_iN?i??, N_{i+1}N?i+1??, ..., N_jN?j?? },其中 1 \le i \le j \le K1≤i≤j≤K.“最大子列和”则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编

PAT-最大子列和问题

01-1. 最大子列和问题(20) 时间限制 10000 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 给定K个整数组成的序列{ N1, N2, ..., NK },"连续子列"被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K."最大子列和"则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11