本题的大致意思为给定一个数组,求其分成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相关推荐

  1. 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 ...

  2. HDU 1024 Max Sum Plus Plus 动态规划

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目大意:n个数分成两两不相交的m段,求使这m段和的最大值. 解题思路:比较坑的点:n2 能过: ...

  3. HDU 1024 ~ Max Sum Plus Plus (DP + XJB优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意:给你 n 个数字,你可以从中选m个子段(子段不能相交).让选出的子段和和最大. 题解:明显 ...

  4. hdu 1024 Max Sum Plus Plus(dp 最大m子段和)

    题意是输入m,n. m为你要求的子段个数,n为数据个数. 由于是很早的题型了,但是理解起来还是很是无力. 并于是用了三天来搞懂此类问题.发现网上大多代码无思路整个过程. 就大致讲解一下DP的整个思路. ...

  5. 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段,然后根据 ...

  6. HDU 1244 Max Sum Plus Plus Plus

    虽然这道题看起来和 HDU 1024  Max Sum Plus Plus 看起来很像,可是感觉这道题比1024要简单一些 前面WA了几次,因为我开始把dp[22][maxn]写成dp[maxn][2 ...

  7. HDU.1003 Max Sum

    原题 HDU.1003 Max Sum 分类 动态规划 题意 计算从一个序列中最大连续子序列和.对应的起始元素和终止元素的位置. 输入/输出 要求与格式 样例数的确定 最开始一行开始输入样例数 每个样 ...

  8. 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 ...

  9. [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 ...

最新文章

  1. Django --ORM常用的字段和参数 多对多创建形式
  2. DeeplyTough | 学习蛋白质结合位点的结构比较
  3. Exp1 PC平台逆向破解(5)M
  4. matlab中循环保存数据
  5. 计算机将成为学生们的老师英语,七年级英语(牛津版)第一学期7A完成句子练习题...
  6. centos+nginx+php+mysql(经典架构流程案例)
  7. 一致性协议raft详解(二):安全性
  8. 人类一败涂地显示服务器,人类一败涂地怎么开服务器 | 手游网游页游攻略大全...
  9. [读书笔记]My Life--Bill Clinton
  10. 在Angular里使用rxjs的异步API - Observable
  11. 虚幻4 控制台_虚幻引擎打造足球手游!实况足球新引擎测试今日开启
  12. java 两个对象合并_Java 对象按照多个属性来合并。
  13. vue 解决跨域 调试_vue+Java后端进行调试时解决跨域问题的方式
  14. spyder设置显示编码_CNC机床参数的设置及报警解除,赶紧收藏吧!
  15. 微信小程序怎么做店铺?
  16. Chloe.Orm多表连接查询 (二)
  17. 基于图像的三维重建——针孔相机模型(1)
  18. 商业银行合规管理用OA:“上报、评估、整改、分析”全面数字化
  19. Web前端是干嘛的 为什么要学Web前端
  20. 互联网公司不同发展阶段需要什么样的技术负责人

热门文章

  1. ios沙盒查找图片展示
  2. MapReduce on Hbase
  3. 企鹅手机即将发布,TencentOS会是亮点么?
  4. [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
  5. android Log工具框架,LogUtils让你摆脱TAG的魔爪
  6. POJ 1797 Heavy Transportation 最短路变形(dijkstra算法)
  7. 追求代码质量: 不要被覆盖报告所迷惑
  8. linux驱动基础开发2——linux 驱动开发前奏(模块编程)-转
  9. java servlet 学习_java学习之web基础(1):Servlet
  10. [swift] LeetCode 35. Search Insert Position