HDU 1024 最大M字段和
一道关于求最大M字段和的问题,翻译完题之后感觉很简单但就是写不来,后来仿佛推到一个dp式子了,对,仿佛...然后抄袭了个式子,嘿,和我的式子大体相似,然后就是很玄学的优化了...不多瞎bb了
1.首先,定义数组num[n],dp[m][n].
num[n]用来存储n个整数组成的序列.dp[i][j]用来表示由前 j项得到的含i个字段的最大值,且最后一个字段以num[j]项结尾。仔细想想,我们可以知:
dp[i][j]=max(dp[i][j-1]+num[j],dp(i-1,t)+num[j]) (i-1<=t<=j-1.)
2.优化
我们只要找到dp[i][j-1]和dp[i-1][t]的最大值加上num[j]即为dp[i][j].所以,定义一个数组pre_max[n],用pre_max[j-1]来表示求解dp[i][j]时dp[i-1][t],得:
dp[i][j]=max(pre_max[j-1],dp[i][j-1])+num[j].
3.再优化
在求解dp[i][j]的同时,我们可以计算出dp[i][t];i<=t<=j的最大值,这个最大值在计算dp[i+1][j+1]的时候需要作为pre_max[j]的形式被使用,我们先把它存在pre_max[n]中。通过时间的节省,我们突然间发现程序执行结束后pre_max[n]的值即为最后的结果,pre_max[n]数组才是我们希望求解的,
4.节省空间
dp[m][n]这个庞大的数组已经不是那么重要了,因此,我们现在用整型数maxx来代替dp[m][n],用来临时存储dp[i][j]的值,作为求解pre_max[n]的中介。这样就节省了dp[i][j]占用的极大的空间.

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 1000005
int pre_max[N],num[N];
int main()
{
int m,n,i,j,maxx;
while(~scanf("%d %d",&m,&n))
{
for(i=;i<=n;i++) scanf("%d",&num[i]);
memset(pre_max,,sizeof(pre_max));
for(i=;i<=m;++i)
{
maxx=;
for(int k=;k<=i;++k) maxx+=num[k];
pre_max[n]=maxx; for(j=i+;j<=n;++j)
{
maxx=max(pre_max[j-]+num[j],maxx+num[j]);
pre_max[j-]=pre_max[n];
pre_max[n]=max(maxx,pre_max[n]);
}
}
printf("%d\n",pre_max[n]);
}
return ;
}
HDU 1024 最大M字段和的更多相关文章
- HDU 1024 max sum plus
A - Max Sum Plus Plus Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- HDU 1024 Max Sum Plus Plus --- dp+滚动数组
HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...
- 怒刷DP之 HDU 1024
Max Sum Plus Plus Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- Max Sum Plus Plus HDU - 1024
Max Sum Plus Plus HDU - 1024 Now I think you have got an AC in Ignatius.L's "Max Sum" ...
- HDU 1024 Max Sum Plus Plus (动态规划)
HDU 1024 Max Sum Plus Plus (动态规划) Description Now I think you have got an AC in Ignatius.L's "M ...
- HDU 1024 Max Sum Plus Plus (动态规划 最大M字段和)
Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To b ...
- HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1024 Max Sum Plus Plus(m个子段的最大子段和)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/ ...
- HDU 1024 A - Max Sum Plus Plus DP + 滚动数组
http://acm.hdu.edu.cn/showproblem.php?pid=1024 刚开始的时候没看懂题目,以为一定要把那n个数字分成m对,然后求m对中和值最大的那对 但是不是,题目说的只是 ...
随机推荐
- 转载 springboot 配置读取
前言:了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件**.properties的信息 ...
- 16进制string转成int
http://blog.csdn.net/wl1524520/article/details/25706521
- vs 2015 运行安卓报错
vs2015 start Android 错误信息如下: Severity Code Description Project File Line Suppression StateError java ...
- Spark实践 -- 夜出顾客服务分析
原文链接:https://www.cnblogs.com/stillcoolme/p/10160397.html 1 业务需求 最近做的24小时书店大数据平台中的一个需求:获取一段时间内只在晚上进店, ...
- Android操作HTTP实现与服务器通信
(转自http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html) 本示例以Servlet为例,演示Android与Servlet ...
- PAT甲 1008. Elevator (20) 2016-09-09 23:00 22人阅读 评论(0) 收藏
1008. Elevator (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The highest ...
- HDU1072 Nightmare(BFS) 2016-07-24 14:02 40人阅读 评论(0) 收藏
Nightmare Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth w ...
- 绩效沟通的best原则
绩效沟通-BEST原则 BEST原则指在进行绩效/IDP面谈的时候按照以下步骤进行: 案例:小赵经常在制作标书时候犯错误 Behavior description 描述行为 小赵,8月6日,你制作的标 ...
- 2014年誓言:干掉网页设计程序——Dreamweaver!
2014年誓言:干掉网页设计程序——Dreamweaver! 阅读: 评论: 作者:Rybby 日期: 来源:rybby.com 2014年,我写下誓言,用自己设计的在线网页设计工具“拉拉变” ...
- [javascript library]使用js实现页面刷新后依然保留表单填写的数据
详情请见于该链接:http://sisyphus-js.herokuapp.com/