hdu 1024 Max Sum Plus Plus(动态规划+m子段和的最大值)
2016-01-28 12:40
387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024
Total Submission(s): 22262 Accepted Submission(s): 7484
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
Sample Output
Author
JGShining(极光炫影)
Recommend
We have carefully selected several similar problems for you: 1074 1025 1080 1160 1078
题目大意:输入一个m,n分别表示成m组,一共有n个数即将n个数分成m组,m组的和加起来得到最大值并输出。
解题思路:状态dp[i][j]表示前j个数分成i组的最大值。
动态转移方程:dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) (0<k<j)
dp[i][j-1]+a[j]表示的是前j-1分成i组,第j个必须放在前一组里面。
max( dp[i-1][k] ) + a[j] )表示的前(0<k<j)分成i-1组,第j个单独分成一组。
但是题目的数据量比较到,时间复杂度为n^3,n<=1000000,显然会超时,继续优化。
max( dp[i-1][k] ) 就是上一组 0....j-1 的最大值。我们可以在每次计算dp[i][j]的时候记录下前j个
的最大值 用数组保存下来 ,这样时间复杂度为 n^2。
详见代码。
Max Sum Plus Plus
Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22262 Accepted Submission(s): 7484
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 3 2 6 -1 4 -2 3 -2 3
Sample Output
6 8 Hint Huge input, scanf and dynamic programming is recommended.
Author
JGShining(极光炫影)
Recommend
We have carefully selected several similar problems for you: 1074 1025 1080 1160 1078
题目大意:输入一个m,n分别表示成m组,一共有n个数即将n个数分成m组,m组的和加起来得到最大值并输出。
解题思路:状态dp[i][j]表示前j个数分成i组的最大值。
动态转移方程:dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) (0<k<j)
dp[i][j-1]+a[j]表示的是前j-1分成i组,第j个必须放在前一组里面。
max( dp[i-1][k] ) + a[j] )表示的前(0<k<j)分成i-1组,第j个单独分成一组。
但是题目的数据量比较到,时间复杂度为n^3,n<=1000000,显然会超时,继续优化。
max( dp[i-1][k] ) 就是上一组 0....j-1 的最大值。我们可以在每次计算dp[i][j]的时候记录下前j个
的最大值 用数组保存下来 ,这样时间复杂度为 n^2。
详见代码。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define N 1000000 #define INF 0x7fffffff int a[N+10]; int dp[N+10],Max[N+10];//max( dp[i-1][k] ) 就是上一组 0....j-1 的最大值。 int main() { int n,m,mmax; while (~scanf("%d%d",&m,&n)) { for (int i=1;i<=n;i++) { scanf("%d",&a[i]); } memset(dp,0,sizeof(dp)); memset(Max,0,sizeof(Max)); for (int i=1;i<=m;i++)//分成几组 { mmax=-INF; for (int j=i;j<=n;j++)//j个数分成i组,至少要有i个数 { dp[j]=max(dp[j-1]+a[j],Max[j-1]+a[j]); Max[j-1]=mmax; mmax=max(mmax,dp[j]); } } printf ("%d\n",mmax); } return 0; }
相关文章推荐
- crc32校验48位mac 地址
- linux内核启动流程分析
- [解析苹果官方文档]之[UIView Class Reference]
- 数组
- 测试设计中需要考虑的22种测试类型
- 二叉排序树(创建,查找,删除)
- js定时执行
- Centos 6.5 安装FTP服务
- MonogoDb的角色分类
- 【Win 10应用开发】响应系统回退键的导航事件
- 【转】Objective-C消息机制的原理
- PHP实现过滤各种HTML标签
- iOS 动态改变cell的高度
- Hibernate各种主键生成器策略与配置详解(转载)
- iOS开发之UILabel动态高度设置方法
- 伸展树学习小结
- CentOS7 网络配置
- 今天上午算是做最后的公司退出
- 第三章 Webdriver Java API简介(上)
- php中curl请求报错:Problem with the SSL CA cert (path? access rights?)