HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化
题目链接:https://cn.vjudge.net/problem/HDU-1024
题意
给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大。
n<=1e6
例:1 3 1 2 3
答:6 (唯一的子串1 2 3)
思路
先顺便记录一下动态规划的一般解题思路:
原问题->子问题->状态->转移->边界
再顺便记录一下最大值最小化这类问题套路解法:
- 二分
- 贪心
不能二分的问题,贪心八九不离十。
一般是AB和BA这两个元素的顺序,不影响前后变化时,直接算目标函数的大小,再按某个数据组合排序即可。
这里还有赖皮写法。
算不出,看不出如何贪心时,随便找个数据组合排个序算答案,直到蒙对为止。
一开始的方程有些擦边,时间有些紧张,还是应该仔细想想(话说我都不知道有这个课前测试,等上课等了半个小时-_-
dp[i][j]表示选择第i个元素,当前是第j个子串。
dp[i][j]=max(dp[i-1][j], dp[k][j-1])+num[i], (k<=i-1)
很显然发现O(n^3)超时,那么开始优化。
第一个显然的优化是max(dp[k][j-1]),这个东西可以一边计算一边维护,但一定要注意细节。
第二个优化其实也是很显然,滚动数组优化掉第一维。
提交过程
| WA | maxdp数组维护错了 |
| AC |
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e6+20, INF=0x3f3f3f3f;
int num[maxn], dp[maxn], maxdp[maxn];
int n, m;
int main(void){
while (scanf("%d%d", &m, &n)==2){
for (int i=1; i<=n; i++) scanf("%d", &num[i]);
memset(dp, 0, sizeof(dp));
memset(maxdp, 0, sizeof(maxdp));
int maxtmp;
for (int j=1; j<=m; j++){
maxtmp=-INF;
for (int i=j; i<=n; i++){
dp[i]=max(dp[i-1], maxdp[i-1])+num[i];
maxdp[i-1]=maxtmp;// max(maxdp[i-1], tmp);
maxtmp=max(dp[i], maxtmp);
}
}
printf("%d\n", maxtmp);
}
return 0;
}
| Time | Memory | Length | Lang | Submitted |
|---|---|---|---|---|
| 390ms | 9432kB | 708 | G++ | 2018-08-13 01:55:29 |
HDU-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段子序列的值, ...
- HDU 1024 Max Sum Plus Plus [动态规划+m子段和的最大值]
Max Sum Plus Plus Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- hdu 1024 Max Sum Plus Plus (动态规划)
Max Sum Plus PlusTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 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 ...
- HUD 1024 Max Sum Plus Plus (滚动数组)
题意:从一个序列中选出分成不交叉的m段 的最大和 解析 : 题目中 1 <= n <=1000000 所以二维数组是不能用了 所以 要想到简化为一维 dp[i][j]表示以i结尾的前i个 ...
- 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【DP】
Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...
- HDU1024 Max Sum Plus Plus —— DP + 滚动数组
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS ...
随机推荐
- JS中let和var的区别
js中let和var定义变量的区别 let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781 ...
- vue2 在methods 中无法获取this对象
在methods中使用箭头函数无法获取this ExamName:()=> { console.log(this);} 这样就行了: ExamName:function() { console. ...
- 【洛谷4941】War2 状压Dp
简单的状压DP,和NOIP2017 Day2 找宝藏 代码几乎一样.(比那个稍微简单一点) f[i][j] ,i代表点的状态,j是当前选择的点,枚举上一个选到的点k 然后从f[i-(1<< ...
- [读书笔记] R语言实战 (六) 基本图形方法
1. 条形图 barplot() #载入vcd包 library(vcd) #table函数提取各个维度计数 counts <- table(Arthritis$Improved) count ...
- mysql创建数据库并指定uft8编码
CREATE DATABASE IF NOT EXISTS ymk default character set utf8 COLLATE utf8_general_ci;
- CRM系统 - 总结 (二) stark组件
介绍: stark组件,是一个帮助开发者快速实现数据库表的增删改查+的组件.目标: 10s 中完成一张表的增删改查. 前戏: django项目启动时,自定义执行某个py文件. django启动时,且在 ...
- iBase4J部署总结
iBase4J部署总结 序言 最近看到个分布式框架,只有一个字:好.所以部署起来看看.开始的时候说实话遇到了点困难.去码云上看了下,貌似想得到指导要加入一个群,而且需要收费的,反正闲来无事,索性自己搞 ...
- 洛谷 P2298 Mzc和男家丁的游戏
P2298 Mzc和男家丁的游戏 题目背景 mzc与djn的第二弹. 题目描述 mzc家很有钱(开玩笑),他家有n个男家丁(做过上一弹的都知道).他把她们召集在了一起,他们决定玩捉迷藏.现在mzc要来 ...
- 在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络
在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络 学习了:https://linux.cn/article-5410-1.html#3_3613 http://www.linu ...
- Node.js 博客实例(一)简单博客
原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第一章.因为版本号等的原因,在原教程基础上稍加修改就可以实现. 环境: win7旗舰版64位 Node ...