[HNOI2008]玩具装箱TOY --- DP + 斜率优化 / 决策单调性
[HNOI2008]玩具装箱TOY
题目描述:
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。
他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。
P教授有编号为\(1......N\)的\(N\)件玩具,第\(i\)件玩具经过压缩后变成一维长度为\(C_{i}\).
为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。
同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,
形式地说如果将第\(i\)件玩具到第\(j\)个玩具放到一个容器中,那么容器的长度将为 \(x= j - i + \sum_{k=i}^{j} C_{k}\)
制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为\(x\),其制作费用为\((x - L) ^ {2}\).
其中\(L\)是一个常量。
P教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过\(L\)。但他希望费用最小.
输入格式:
第一行输入两个整数\(N,L\).
接下来\(N\)行输入\(C_{i}\).
\(1<=N<=50000, 1<=L,C_{i}<=10^{7}\)
输出格式:
输出最小费用
不难想到,\(dp(i)\)表示把\(1......i\)号玩具装箱的最小费用。
那么有\(dp(i)=min(dp(j)+(\sum_{k=j}^{i} C_{k} + i - j - L - 1)^{2})\)
这个\(O(n^{2})\)的DP一定会超时,因此想办法优化。
决策单调性:
如果把决策点打出来,(用\(O(n^2)\)的DP来记录)
可以观察到满足决策单调性
而这个东西非常的套路。
维护一个\(tra\)指针,表示循环枚举的\(i\)从哪里转移,\(tra\)指针要及时更新
更新出\(dp(i)\)后,用\(dp(i)\)去决定\(i\)的决策区间在哪里
第一步:如果栈顶的决策点不如\(i\),把栈顶决策点退栈,重复直到不满足条件。
(注:细节:当决策点区间右端点比\(i\)还小时,同样要退出循环,并且此时\(i\)的右边全部是它的决策区间,不需要后面的二分了)
第二步:在当前栈顶决策区间中二分,二分出哪些区间的决策点应该更换为\(i\)
时间复杂度:\(O(n \log n)\)
不用化式子,只要打表就好了,这么好的算法,为什么不用用??
斜率优化:
\(dp(i)=min(dp(j)+(\sum_{k=j}^{i} C_{k} + i - j - L - 1)^{2})\)
不妨设 \(pre(i)=\sum_{j=1}^{i} C_{j} +i\)
为了方便,默认\(L++\)
那么
\(dp(i)=dp(j)+(pre(i)-pre(j)-L)^{2}\)
\(dp(i)=dp(j)+pre(i)^{2}+pre(j)^{2}+L^{2}-2*pre(i)*pre(j)-2*pre(i)*L+2*pre(j)*L\)
\(dp(j)-pre(j)^{2}-2*pre(j)*L= -2*pre(i)*pre(j) - dp(i) - 2*pre(i)*L+pre(i)^{2}+L*L\)
那么现在就是一个形如\(y=kx+b\)的式子了
其中\( -2 * pre(i) \)为\( k \),单调递减
其中\(pre(j)\)为\( x \),单调递增
同时,要使\(dp(i)\)最小,就要使\(b\)最大
所以我们要维护一个上凸壳。
因为\(k,x\)同时单调递增,可以选择单调队列
复杂度:\(O(n)\)
[HNOI2008]玩具装箱TOY --- DP + 斜率优化 / 决策单调性的更多相关文章
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- BZOJ.1010.[HNOI2008]玩具装箱toy(DP 斜率优化/单调队列 决策单调性)
题目链接 斜率优化 不说了 网上很多 这的比较详细->Click Here or Here //1700kb 60ms #include<cstdio> #include<cc ...
- 1010: [HNOI2008]玩具装箱toy [dp][斜率优化]
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- BZOJ1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 12451 Solved: 5407[Submit][Status][Discuss] Descript ...
- P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)
P3195 [HNOI2008]玩具装箱TOY 设前缀和为$s[i]$ 那么显然可以得出方程 $f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$ 换下顺序 $f[i]=f[j]+( ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
- 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9330 Solved: 3739 Descriptio ...
- 1010: [HNOI2008]玩具装箱toy(斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 12280 Solved: 5277[Submit][S ...
- [HNOI2008]玩具装箱toy(斜率优化dp)
前言 这是我写的第一道$dp$斜率优化的题目,$dp$一直都很菜,而且咖啡鸡都说了这是基础的东西,然而看别人对$dp$斜率优化一大堆公式又看不懂就老老实实做几道题目,这个比较实在 描述 给出$n$和$ ...
随机推荐
- 【leetcode 简单】第五题 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...
- win10环境变量
jdk8 JAVA_HOME D:\devsoft\jdk\jdk1.8 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar pa ...
- 利用Jsoup模拟跳过登录爬虫获取数据
今天在学习爬虫的时候想着学习一下利用jsoup模拟登录.下面分为有验证码和无验证码的情况进行讨论. ---------------------------无验证码的情况---------------- ...
- docker安装总结 linux红帽系列
由于Docker限制分为两个版本CE和EE,所以之前yum里面的docker是老版本,需要先进行卸载,现在的包名叫做docker-ce yum remove docker docker-common ...
- netif_start_queue/netif_wake_queue/netif_stop_queue
在网卡驱动中,内核为发送数据包的流量控制提供了几个主要的函数,用来在驱动程序和内核之间传递流控信息. 主要有4个: 1]netif_start_queue 启动接口传输队列 2]netif_wake ...
- xargs -i 和-I 的区别【转】
xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如 # find . -type f -name "*.log" | xargs rm -rf * ...
- Python设计模式中单例模式的实现及在Tornado中的应用
单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def new(cls, *args): if not isinstan ...
- python 异常知识点
raise from python 在3.0 之后引入了raise from 表达式: raise exception from otherexception 当使用该语法时,第二个表达式指定了另一个 ...
- Logistic回归与梯度上升算法
原创作品出处 原始出处 .作者信息和本声明.否则将追究法律责任.http://sbp810050504.blog.51cto.com/2799422/1608064 Logistic回归与梯度上升算法 ...
- Jmeter中的变量(三)
变量(Variables) Jmeter中的变量(参数化)目的是为了提供改变请求变化的机制.比如登录场景,一般不能使用同一个账号做并发操作. 变量的特点 1) JMeter变量对于测试线程而言是局部变 ...