题目链接:https://cn.vjudge.net/problem/HDU-1024

题意

给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大。

n<=1e6

例:1 3 1 2 3

答:6 (唯一的子串1 2 3)

思路

先顺便记录一下动态规划的一般解题思路:

原问题->子问题->状态->转移->边界

再顺便记录一下最大值最小化这类问题套路解法:

  1. 二分
  2. 贪心

    不能二分的问题,贪心八九不离十。

    一般是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 动态规划 滚动数组和转移优化的更多相关文章

  1. HDU 1024 Max Sum Plus Plus --- dp+滚动数组

    HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...

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

  3. hdu 1024 Max Sum Plus Plus (动态规划)

    Max Sum Plus PlusTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

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

  5. HUD 1024 Max Sum Plus Plus (滚动数组)

    题意:从一个序列中选出分成不交叉的m段 的最大和 解析 : 题目中 1 <= n <=1000000 所以二维数组是不能用了  所以 要想到简化为一维 dp[i][j]表示以i结尾的前i个 ...

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

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

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

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

随机推荐

  1. Unity 脚本挂载位置

    原则:谁的脚本,挂载到谁身上 1,一般场景中会有个GameController脚本,挂在空物体上. 2,我见很多人脚本习惯挂到Camera上,好吧,不知算不算规范.

  2. Eclipse中使用GIT提交文件至本地

    GIT提交文件至本地: 1.  右击项目——Team——Commit…: 2.在弹出的Commit Changes框中——选择要提交的文件——填写提交说明——点击Commit,即可提交至本地.

  3. zabbix_agent代理端监控FTP服务

    (FTP服务器) 监控agent的Linux主机我们在之前就已经做好了,现在直接安装ftp服务即可 (可以看上一遍文章如何搭建监控端agent)  这里不过多演示 [root@agent ~]# yu ...

  4. JWT加密

    JWT是一种加密算法,为了防止请求的信息在传输途中被拦截修改 JWT的引用: install-package jwt JWF由三部分组成:Header,Payload,Signature Payloa ...

  5. 02 C#高级

    第九天 面向过程--à面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 把大象塞进冰箱 1. 打开冰箱门 2. 把大象塞进去,亲下大象的屁股 3. 关闭冰箱门 孙全 瘦小 ...

  6. django-10-中间件和上下文管理器

    <<<中间件的引入>>> 用户<->中间件<->url->视图  在app目录里面 middleware.py  (1)中间件就是一个 ...

  7. SpringBoot下支付宝接口的使用

    SpringBoot下支付宝接口的使用 前期准备: 参考之前写过的 支付宝接口引入servlet版本 Jar包引入: <!-- 支付宝 --> <dependency> < ...

  8. Spring IoC简介及使用

    Spring根本任务 Spring的根本任务就是简化Java开发. 目前许多框架如果要使用他们,就必须要继承或实现这些框架的各种类.这使得框架与我们的程序耦合度过高.由于在我们的程序中加入了过多的框架 ...

  9. Docker可视化管理工具对比(DockerUI、Shipyard、Rancher、Portainer)

    1.前言 谈及docker,避免不了需要熟练的记住好多命令及其用法,对于熟悉shell.技术开发人员而言,还是可以接受的,熟练之后,命令行毕竟是很方便的,便于操作及脚本化.但对于命令行过敏.非技术人员 ...

  10. javascript-datatable错误提示

    datatables插件在使用的时候出现了如下错误提示**出现此错误的原因可能是你写的table中没有加上<thead>和<tbody>标签所致**     来自为知笔记(Wi ...