HDU 1024 Max Sum Plus Plus
本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题。
读完题就能看出要用DP,但是因为m的范围没有限定,= =加上自己太菜不知道怎么写, 总之先膜拜大佬http://www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html
读完大佬的代码还是有点懵,用自己容易理解的方式 稍微记录一下。
设dp[i][j]为,分为i段的时候,到第j个数字为止,且包含第j个数字的最大值。
进行状态转移的时候,当我们访问到第j个数字,我们需要判断它是独立成组,还是包含在已有的段内。
所以dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) (i-1<=k<=j-1)
但是本题如果直接开双数组的话(n和m会达到的最大值太大),会编译失败。仔细观察的话,可以发现只与该段和前一段有关
所以我们每次只需要记录最近的两段即可,通过滚动数组进行优化。
本题用cin输入的话 耗时是比scanf多了近一倍 ,看了下别人的博客学到了一个好方法就是在该函数里面加std::ios::sync_with_stdio(false); cin用时就会减少
另外,这个算法的复杂度是O(mn),题目中的m没有给出来,但测试数据中是一个较小的值(1000以下),所以能用这种方法AC。
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <map> #include <cstring> using namespace std; typedef long long LL; const int MAXN=1e6+10; const LL INF=1e18; LL dp[MAXN]; LL a[MAXN]; LL maxx[MAXN]; int main() {int m,n;LL tmp;while(scanf("%d%d",&m,&n)!=EOF){if(m>100)while(1);memset(dp,0,sizeof(dp));memset(maxx,0,sizeof(maxx));for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=m;i++){tmp=-INF;for(int j=i;j<=n;j++){dp[j]=max(dp[j-1]+a[j],maxx[j-1]+a[j]);maxx[j-1]=tmp;//记录到j-1为止的最大值,留给下一段使用。tmp=max(dp[j],tmp);//记录该段目前为止的最大值,进行maxx数组的更新操作。 }}printf("%lld\n",tmp);}return 0; }
---恢复内容结束---
转载于:https://www.cnblogs.com/a249189046/p/6624928.html
HDU 1024 Max Sum Plus Plus相关推荐
- HDU 1024 Max Sum Plus Plus
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java ...
- HDU 1024 Max Sum Plus Plus 动态规划
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目大意:n个数分成两两不相交的m段,求使这m段和的最大值. 解题思路:比较坑的点:n2 能过: ...
- HDU 1024 ~ Max Sum Plus Plus (DP + XJB优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意:给你 n 个数字,你可以从中选m个子段(子段不能相交).让选出的子段和和最大. 题解:明显 ...
- hdu 1024 Max Sum Plus Plus(dp 最大m子段和)
题意是输入m,n. m为你要求的子段个数,n为数据个数. 由于是很早的题型了,但是理解起来还是很是无力. 并于是用了三天来搞懂此类问题.发现网上大多代码无思路整个过程. 就大致讲解一下DP的整个思路. ...
- HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化
给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续) 例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段. dp[i][j]从前j个数字中选择i段,然后根据 ...
- HDU 1244 Max Sum Plus Plus Plus
虽然这道题看起来和 HDU 1024 Max Sum Plus Plus 看起来很像,可是感觉这道题比1024要简单一些 前面WA了几次,因为我开始把dp[22][maxn]写成dp[maxn][2 ...
- HDU.1003 Max Sum
原题 HDU.1003 Max Sum 分类 动态规划 题意 计算从一个序列中最大连续子序列和.对应的起始元素和终止元素的位置. 输入/输出 要求与格式 样例数的确定 最开始一行开始输入样例数 每个样 ...
- HDUOJ 1024 Max Sum Plus Plus
HDUOJ 1024 Max Sum Plus Plus 题目链接 Problem Description Now I think you have got an AC in Ignatius.L's ...
- [Hdoj 1024] Max Sum Plus Plus
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Problem Description Now I think you have got an AC ...
最新文章
- Django --ORM常用的字段和参数 多对多创建形式
- DeeplyTough | 学习蛋白质结合位点的结构比较
- Exp1 PC平台逆向破解(5)M
- matlab中循环保存数据
- 计算机将成为学生们的老师英语,七年级英语(牛津版)第一学期7A完成句子练习题...
- centos+nginx+php+mysql(经典架构流程案例)
- 一致性协议raft详解(二):安全性
- 人类一败涂地显示服务器,人类一败涂地怎么开服务器 | 手游网游页游攻略大全...
- [读书笔记]My Life--Bill Clinton
- 在Angular里使用rxjs的异步API - Observable
- 虚幻4 控制台_虚幻引擎打造足球手游!实况足球新引擎测试今日开启
- java 两个对象合并_Java 对象按照多个属性来合并。
- vue 解决跨域 调试_vue+Java后端进行调试时解决跨域问题的方式
- spyder设置显示编码_CNC机床参数的设置及报警解除,赶紧收藏吧!
- 微信小程序怎么做店铺?
- Chloe.Orm多表连接查询 (二)
- 基于图像的三维重建——针孔相机模型(1)
- 商业银行合规管理用OA:“上报、评估、整改、分析”全面数字化
- Web前端是干嘛的 为什么要学Web前端
- 互联网公司不同发展阶段需要什么样的技术负责人
热门文章
- ios沙盒查找图片展示
- MapReduce on Hbase
- 企鹅手机即将发布,TencentOS会是亮点么?
- [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
- android Log工具框架,LogUtils让你摆脱TAG的魔爪
- POJ 1797 Heavy Transportation 最短路变形(dijkstra算法)
- 追求代码质量: 不要被覆盖报告所迷惑
- linux驱动基础开发2——linux 驱动开发前奏(模块编程)-转
- java servlet 学习_java学习之web基础(1):Servlet
- [swift] LeetCode 35. Search Insert Position