hdu 1231 最大连续子序列(dp)

Problem Description
给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., 
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,输出整个序列的首尾元素。 
 
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 }