HDU1024 Max Sum Plus Plus
2015-09-21 09:07
323 查看
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
题目的意思是给定一个数组,求将其分成m个不相交字段和最大值的问题。
状态转移方程:dp[i][j]表示以i为结尾元素的j个字段的和
则dp[i][j] = max(dp[i-1][j] , dp[i-k][j-1]) + a[i];其中j-1<=k<=n+m+1
注:OJ上运行的时候将类名换成Main。
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
题目的意思是给定一个数组,求将其分成m个不相交字段和最大值的问题。
状态转移方程:dp[i][j]表示以i为结尾元素的j个字段的和
则dp[i][j] = max(dp[i-1][j] , dp[i-k][j-1]) + a[i];其中j-1<=k<=n+m+1
import java.util.Scanner; public class P1024 { final int INF = Integer.MAX_VALUE; final int MAXN = 1000010; int[] dp = new int[MAXN]; int[] pre_max = new int[MAXN]; int[] num = new int[MAXN]; public static void main(String[] args) { new P1024().run(); } //dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + a[j] ) 0<k<j public void run(){ Scanner scanner = new Scanner(System.in); int m, n; while (scanner.hasNextInt()) { m = scanner.nextInt(); n = scanner.nextInt(); int maxx = -INF; for (int i = 1; i <= n; i++) { num[i] = scanner.nextInt(); dp[i] = 0; pre_max[i] = 0; } dp[0] = 0; pre_max[0] = 0; for (int i = 1; i <= m; i++) { maxx = -INF; for (int j = i; j <= n; j++) { dp[j] = Math.max(dp[j-1] + num[j], pre_max[j-1] + num[j]); pre_max[j - 1] = maxx; maxx = Math.max(maxx, dp[j]); } } System.out.println(maxx); } scanner.close(); } }
注:OJ上运行的时候将类名换成Main。
相关文章推荐
- HTML5 标签audio添加网页背景音乐代码
- 常用网址收藏
- comboBox设置当前实现数据
- 时间格式化hh:mm:ss和HH:mm:ss区别
- typedef和#define的用法与区别
- 求一个不含0的数列(可以有正数和负数)的最大子序列乘积java
- knockoutJS学习笔记02:jsRender模板引擎
- 网页语言有html,php.jsp,无论什么语言浏览器总是能正常显示,这个解析工作是浏览器完成的吗?
- LDA-math-MCMC 和 Gibbs Sampling
- 对lambda表达式的解析(一)
- C#进阶系列——DDD领域驱动设计初探(一):聚合
- c#中简单工厂模式
- iOS开发中的几个手势操作实例分享
- Bootstrap碎语
- 循环以及条件测试
- 批处理实现乱雨纷飞(黑客帝国特效)
- Masonry介绍与使用实践:快速上手Autolayout
- 【bzoj1192】 HNOI2006鬼谷子的钱袋 水题
- Java类加载器深入探索
- muduo源代码分析--Reactor在模型muduo使用(两)