HUD 1024 Max Sum Plus Plus (滚动数组)
题意:从一个序列中选出分成不交叉的m段 的最大和
解析 : 题目中 1 <= n <=1000000 所以二维数组是不能用了 所以 要想到简化为一维
dp[i][j]表示以i结尾的前i个数 分成j组的最大和 对于一个数A[i] 我们有两种选择,一是与第(i-1)个数在一组 或者 自成一组 ,所以状态方程就出来了
dp[i][j] = max(dp[i-1][j], max(dp[k][j-1] {k| 1<= k <= i-1} ))+A[i];
max(dp[k][j-1] {k| 1<= k <= i-1})表示前i-1个数组成的j-1组的最大值
这道题没有说m是多少 所以比较尴尬。。。 又因为每个状态只与它一个状态有关,那么就用滚动数组好了
maxx = max(maxx, dp[k^1][i-1]); // 前(i-1)个 分成(k-1)组的最优解
异或^是相同为0,不同为1,可以用^1来转换状态
dp[k][i] = max(dp[k][i-1], maxx) + A[i];
滚动数组讲解:https://www.cnblogs.com/WTSRUVF/p/9210633.html
具体详情见代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn =, INF = 0x7fffffff;
int A[maxn], dp[][maxn];
int main()
{
int m, n;
while(~scanf("%d%d",&m,&n))
{
mem(dp,);
mem(A,);
int k =; // 初始化为0
for(int i=; i<=n; i++)
scanf("%d",&A[i]);
int maxx, ret;
for(int j=; j<=m; j++)
{
k ^=; //因为只与j和j-1两个状态有关 所以每次都要异或
maxx = dp[k^][j-]; //maxx的意义为 前j-1个数 分成k-1组的最优解 又第j组最小是j个数 所以每次的maxx开始值为 dp[j-1][j-1] 即 dp[k^1][j-1]
dp[k][j] = dp[k^][j-] + A[j]; // 因为选择第i个数,分成i段,所以只能自己成一段,那么只能这样写;
ret = dp[k][j]; //ret 为这些数分成k组后最大的值 开始值为dp[k][j];
for(int i=j+; i<=n; i++)
{
maxx = max(maxx, dp[k^][i-]);
dp[k][i] = max(dp[k][i-], maxx) + A[i];
ret = max(ret, dp[k][i]);
}
}
printf("%d\n",ret); } return;
}
HUD 1024 Max Sum Plus Plus (滚动数组)的更多相关文章
- HDU 1024 Max Sum Plus Plus --- dp+滚动数组
HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...
- hdu1003 1024 Max Sum&Max Sum Plus Plus【基础dp】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4302208.html ---by 墨染之樱花 dp是竞赛中常见的问题,也是我的弱项orz, ...
- 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个子段的最大子段和)
传送门: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 最大m段子段和+滚动数组优化
给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续) 例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段. dp[i][j]从前j个数字中选择i段,然后根据 ...
- HDU 1024 max sum plus
A - Max Sum Plus Plus Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- HDOJ 1024 Max Sum Plus Plus -- 动态规划
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Problem Description Now I think you have got an ...
- hdu 1024 Max Sum Plus Plus DP
Max Sum Plus Plus Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php ...
- HDU 1024 Max Sum Plus Plus 简单DP
这题的意思就是取m个连续的区间,使它们的和最大,下面就是建立状态转移方程 dp[i][j]表示已经有 i 个区间,最后一个区间的末尾是a[j] 那么dp[i][j]=max(dp[i][j-1]+a[ ...
随机推荐
- Linux系列教程(五)——Linux常用命令之链接命令和权限管理命令
前一篇博客我们讲解了Linux文件和目录处理命令,还是老生常淡,对于新手而言,我们不需要完全记住命令的详细语法,记住该命令能完成什么功能,然后需要的时候去查就好了,用的多了我们就自然记住了.这篇博客我 ...
- Spring 面试问题 TOP 50
Spring 面试问题 TOP 50 Spring Framework 现在几乎已成为 Java Web 开发的标配框架.那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢? ...
- JS-JS作用域问题
一. js没有块级作用域(可以自己闭包或其他方法实现),只有函数级作用域,函数外面的变量函数里面可以找到,函数里面的变量外面找不到. var a=10; function fn(){ console. ...
- 利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe)
原文:利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe) 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了.这 ...
- Ionic app 上传图片之webApi接口
App上传图片对应的webApi服务端是怎么处理的呢? using System; using System.Collections.Generic; using System.Diagnostics ...
- Ionic下的Jpush消息推送与内容显示
本文测试Jpush将消息推送给手机端,手机端点击通知栏,即可看到具体的推送内容. 1.极光推送消息设置 设置附加字段: 点击发送,手机端收到消息通知. 2.手机接收到的消息通知 点击之后进入具体的页面 ...
- 浅谈左偏树在OI中的应用
Preface 可并堆,一个听起来很NB的数据结构,实际上比一般的堆就多了一个合并的操作. 考虑一般的堆合并时,当我们合并时只能暴力把一个堆里的元素一个一个插入另一个堆里,这样复杂度将达到\(\log ...
- maven项目中 org.hibernate.MappingNotFoundException: resource:*.hbm.xml not found问题的解决方案
是因为*.hbm.xml没有放到resource的mapper下导致的 对于Maven工程,编译的工作是由Maven程序来完成的,而Maven默认只会把src/main/resources文件夹下的文 ...
- 任务(task)
任务概述 线程(Thread)是创建并发的底层工具,因此有一定的局限性(不易得到返回值(必须通过创建共享域):异常的捕获和处理也麻烦:同时线程执行完毕后无法再次开启该线程),这些局限性会降低性能同时影 ...
- springboot undertow替换tomcat方式
版权声明: https://blog.csdn.net/weixin_38187317/article/details/81532560说明 undertow,jetty和tomcat可 ...