hdu1024--Max Sum Plus Plus(dp)

来源:互联网 发布:phpstorm配置apache 编辑:程序博客网 时间:2024/05/16 14:56
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.
 

Output
Output the maximal summation described above in one line.
 

Sample Input
1 3 1 2 32 6 -1 4 -2 3 -2 3
 

Sample Output
68求最大m子段和,转移方程为dp[i][j] = max(dp[i][j - 1] + a[j], dp[i - 1][k] + a[j]),(i - 1 <= k <= j - 1), 其中dp[i][j]表示前j个数中取i字段的最大和,且状态由第j个数直接连在j - 1的后面和前k个数形成i - 1子段而a[j]独立形成第i字段两种状态转移而来。source code:
#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int inf = 0x3fffffff;const int maxn = 1000005;int dp[maxn], pre[maxn], a[maxn];int n, m, mmax;int main(){    while (scanf("%d%d", &m, &n) != EOF) {        for (int i = 1; i <= n; i++) {            scanf("%d", &a[i]);            dp[i] = 0;            pre[i] = 0;        }        dp[0] = 0, pre[0] = 0;        for (int i = 1; i <= m; i++) {            mmax = -inf;            for (int j = i; j <= n; j++) {                dp[j] = max(dp[j - 1] + a[j], pre[j - 1] + a[j]);  //pre[j - 1]表示前j - 1个数中的最大值                pre[j - 1] = mmax;                mmax = max(mmax, dp[j]);            }        }        printf("%d\n", mmax);    }    return 0;}


0 0
原创粉丝点击