Problem Description
给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
Input
测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
Sample Input
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
Sample Output
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 int[] dp=new int[10005];//最大连续子序列最大和 8 int[] arrays=new int[10005];//整数序列 9 10 Scanner input=new Scanner(System.in); 11 int n=input.nextInt(); 12 13 while(n!=0) { 14 15 /* 16 * start表示最大连续子序列 的第一个元素;end表示最大连续子序列的最后一个元素;submax表示以arrays[i]为右边界的最大连续子序列;left表示以submax的左边界; 17 */ 18 int start,end,left,submax,i; 19 20 for(i=0;i<n;i++) { 21 22 arrays[i]=input.nextInt(); 23 24 } 25 26 left=start=end=arrays[0]; 27 dp[0]=submax=arrays[0]; 28 29 for(i=1;i<n;i++) { 30 31 if(arrays[i]>arrays[i]+submax) { 32 33 submax=arrays[i]; 34 left=arrays[i]; 35 36 }else { 37 38 submax=arrays[i]+submax; 39 40 } 41 42 if(dp[i-1]>=submax) { 43 44 dp[i]=dp[i-1]; 45 46 }else { 47 48 dp[i]=submax; 49 start=left; 50 end=arrays[i]; 51 52 } 53 54 } 55 56 if(dp[n-1]<0) { 57 58 dp[n-1]=0; 59 start=arrays[0]; 60 end=arrays[n-1]; 61 62 } 63 64 System.out.println(dp[n-1]+" "+start+" "+end); 65 66 n=input.nextInt(); 67 68 } 69 70 } 71 72 }