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. ^_^
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.
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
- HDU1024 Max Sum Plus Plus 【DP】
- HDU1024 Max Sum Plus Plus(DP)
- hdu1024--Max Sum Plus Plus(dp)
- hdu1024 Max Sum Plus Plus--DP
- HDU1024 Max Sum Plus Plus //DP
- hdu1024 Max Sum Plus Plus dp
- HDU1024-Max Sum Plus Plus(dp)
- 【HDU1024】Max Sum Plus Plus(dp)
- hdu1024-Max Sum Plus Plus
- hdu1024 Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- HDU1024--Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- hdu1024 Max Sum Plus Plus
- hdu1024---Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- hdu1024 Max Sum Plus Plus
- 数组中出现次数超过一半的数字
- 应用程序的启动图
- 6.13
- KVC、KVO的用法
- HDOJ 题目3749 Financial Crisis(双联通)
- hdu1024--Max Sum Plus Plus(dp)
- mysql分区
- 浙江大学PAT_乙级_1002. 写出这个数 (20)
- HDOJ 核反应堆 2085
- 双目定标和双目校正
- 事务是什么
- HelloWorld_Servlet-servlet框架搭建
- UI的开始————UIView,UILabel,UITextField,UIButton
- JKS_密钥对生成与读取方法