【原】 POJ 2593 Max Sequence 动态规划 解题报告
http://poj.org/problem?id=2593
Maximum Sequence
求数组两段不重叠的连续子数组的最大和
详见2479
Description
Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N).
You should output S.
Input
The input will consist of several test cases. For each test case, one integer N (2 <= N <= 100000) is given in the first line. Second line contains N integers. The input is terminated by a single line with N = 0.
Output
For each test of the input, print a line containing S.
Sample Input
5
-5 9 -5 11 20
0
Sample Output
40
1: #include <stdio.h>
2: #include <iostream>
3:
4: using namespace std ;
5:
6:
7: const int N = 100000 ;
8:
9: int a[N] ;
10: int maxsofar[2][N] ;
11:
12: void run2593()
13: {
14: int n,val ;
15: int i,j ;
16: int maxendinghere ;
17: int max ;
18: int sum ;
19:
20: while( scanf( "%d", &n ) && n!=0 )
21: {
22: scanf( "%d", &a[0] ) ;
23: maxendinghere = a[0] ;
24: maxsofar[0][0] = a[0] ;
25: for( i=1 ; i<n ; ++i )
26: {
27: scanf( "%d", &a[i] ) ;
28: maxendinghere = std::max( a[i] , maxendinghere+a[i] ) ;
29: maxsofar[0][i] = std::max( maxsofar[0][i-1] , maxendinghere ) ;
30: }
31:
32: maxendinghere = a[n-1] ;
33: maxsofar[1][n-1] = a[n-1] ;
34: max = maxsofar[0][n-2] + a[n-1] ;
35: for( i=n-2 ; i>0 ; --i )
36: {
37: maxendinghere = std::max( a[i] , a[i]+maxendinghere ) ;
38: maxsofar[1][i] = std::max( maxsofar[1][i+1] , maxendinghere ) ;
39: sum = maxsofar[0][i-1] + maxsofar[1][i] ;
40: max = max>sum ? max : sum ;
41: }
42: printf( "%d\n" , max ) ;
43: }
44: }