输入样例:

1 3 1 2 3
2 6 -1 4 -2 3 -2 3

输出样例:

6
8

分析:给定n个数,让你从这n个数中选取m个不相交连续子段,求所有被选取的数的和的最大值

跟这道题目非常类似:(ACWing4378)选取数对(动态规划)_AC__dream的博客-CSDN博客,建议大家先看一下我上面给出的这道题目的思路,当前题目跟上面这道题目不同的地方在于当前题目选取的区间长度是不固定的,所以我们就需要遍历上一段区间的右端点来更新答案。

下面进行具体讲解:

设f[i][j]表示更新到第i个位置且选取了j段的所有情况的最大值,其中第i个数是第j段数的最后一个数,对于第i个位置的更新也很简单,要么把第i个数放入之前已经选取的最后一段的最后一个位置,要么就是把第i个数单独作为新的一段存放,那么就有:

f[i][j]=max(max(f[j-1~i-1][j-1]),f[i-1][j])+a[i]

但是这样显然会超内存,所以我们有必要对空间进行优化,发现分成j段的情况只需要用到分成j段的情况和分成j-1段的情况,所以我们就可以想到优化01背包那样的优化方式来对这个问题进行优化,就是用一个mx[k]记录f[j-1~k][j-1]的最大值,这样我们只需要在过程中顺便更新,到用的时候可以直接拿出来使用。分析到这也就比较透彻了,细节见代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=1e5+10;
int f[N],mx[N],a[N];
int main()
{int n,m;while(cin>>m>>n){for(int i=1;i<=n;i++)scanf("%d",&a[i]),f[i]=mx[i]=0;int mxx; for(int j=1;j<=m;j++)//分成j段 {mxx=-0x3f3f3f3f;//用于更新分成j段的mx数组,记录前i个数分成j段的mx数组的最大值 for(int i=j;i<=n;i++){f[i]=max(mx[i-1],f[i-1])+a[i];mx[i-1]=mxx;mxx=max(mxx,f[i]);}}cout<<mxx<<endl;}return 0;
}

(HDU-1024)Max Sum Plus Plus(动态规划)相关推荐

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

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

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

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

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

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

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

  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 1024 Max Sum Plus Plus

    本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题. 读完题就能看出要用DP,但是因为m的范围没有限定,= =加上自己太菜不知道怎么写, 总之先膜拜大佬http://www.cnblo ...

  7. HDU 1244 Max Sum Plus Plus Plus

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

  8. HDU.1003 Max Sum

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

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

  10. hdu 1003 Max Sum 解题报告

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem Description Given a sequence a[1],a[2],a[3 ...

最新文章

  1. 11、设置视图半透明而子控件不透明
  2. MySql入门笔记二~悲催的用户
  3. C++中常量成员函数的含义
  4. ubuntu查看安装软件的版本
  5. 北京上海等昨天大规模断网 专家称与太阳无关
  6. 【BZOJ1124】[POI2008]枪战Maf(基环树_构造)
  7. 使用MSAgent代替传统的MessageBox提示来增用客户端用户体验
  8. Ubuntu 的ADSL设置(转)
  9. cad计算机清空按键,cad delete键不能用怎么办-解决cad按delete键不能删除的方法 - 河东软件园...
  10. MYSQL_DQL语言的学习(1)
  11. 1000套微信小程序源码源代码带后台带运行截图预览图学习资料网盘下载
  12. Android MD5加密法
  13. 【数据结构】用Java实现动态数组
  14. think php 广告位,海报广告位管理 - 简单好用的海报和广告管理工具 – 基于ThinkPHP和Bootstrap的极速后台开发框架...
  15. 二项分布的期望值 E(n)=np 推导
  16. CEF(Chromium Embedded Framework和JavaScript交互相互调用函数和设置数据
  17. 笔记本计算机提升性能,笔记本电脑越来越卡?教你如何有效的提升性能-笔记本电脑卡怎么办...
  18. gprs模块连接到服务器,如何再使用AT命令
  19. 【软工】 软件体系结构
  20. 如何向领导汇报工作(4)

热门文章

  1. 第二届网刃杯网络安全大赛 Writeup
  2. matlab如何打开dcm_MATLAB结合Unreal Engine构建用以自动驾驶仿真测试的逼真驾驶场景...
  3. profession of WOWChina-Quote from ngacn.com
  4. C语言赋值过程中的类型转换
  5. 一个新的Maemo5平台下的QStarDict移植版本
  6. 【重磅推荐: 强化学习课程】清华大学李升波老师《强化学习与控制》
  7. 华东政法大学教学管理系统_华东政法大学教学管理系统(华政研究生管理信息系统)...
  8. 前端操作pdf文件实现添加水印效果
  9. Leetcode :421. 数组中两个数的最大异或值 (位运算)
  10. 一种4k图像数据增强技术