hdu 1024 Max Sum Plus Plus (动态规划)
Max Sum Plus Plus
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 37418 Accepted Submission(s): 13363
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 37418 Accepted Submission(s): 13363
Problem Description
Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem.
Given a consecutive number sequence S1, S2, S3, S4 ... Sx, ... Sn (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ Sx ≤ 32767). We define a function sum(i, j) = Si + ... + Sj (1 ≤ i ≤ j ≤ n).
Now given an integer m (m > 0), your task is to find m pairs of i and j which make sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + ... + sum(im, jm) maximal (ix ≤ iy ≤ jx or ix ≤ jy ≤ jx is not allowed).
But I`m lazy, I don't want to write a special-judge module, so you don't have to output m pairs of i and j, just output the maximal summation of sum(ix, jx)(1 ≤ x ≤ m) instead. ^_^
Input
Each test case will begin with two integers m and n, followed by n integers S1, S2, S3 ... Sn.
Process to the end of file.
Each test case will begin with two integers m and n, followed by n integers S1, S2, S3 ... Sn.
Process to the end of file.
Output
Output the maximal summation described above in one line.
Output the maximal summation described above in one line.
Sample Input
1 3 1 2 3
2 6 -1 4 -2 3 -2 3
1 3 1 2 3
2 6 -1 4 -2 3 -2 3
Sample Output
6
8
6
8
Hint
Huge input, scanf and dynamic programming is recommended.
C/C++:
1 #include <bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 using namespace std; 4 5 const int MAX = 1e6 + 10; 6 7 int m, n, pre[MAX], dp[MAX], num[MAX], ans, j; 8 9 int main() 10 { 11 while (~scanf("%d%d", &m, &n)) 12 { 13 memset(dp, 0, sizeof(dp)); 14 memset(pre, 0, sizeof(pre)); 15 16 for (int i = 1; i <= n; ++ i) scanf("%d", &num[i]); 17 for (int i = 1; i <= m; ++ i) 18 { 19 ans = -INF; 20 for (j = i; j <= n; ++ j) 21 { 22 dp[j] = max(dp[j - 1], pre[j - 1]) + num[j]; 23 pre[j - 1] = ans; 24 ans = max(dp[j], ans); 25 } 26 // pre[j - 1] = ans; 27 } 28 29 printf("%d\n", ans); 30 } 31 return 0; 32 }