[HNOI2008]玩具装箱toy(斜率优化dp)
前言
这是我写的第一道$dp$斜率优化的题目,$dp$一直都很菜,而且咖啡鸡都说了这是基础的东西,然而看别人对$dp$斜率优化一大堆公式又看不懂就老老实实做几道题目,这个比较实在
描述
给出$n$和$l$.有$n$个玩具,第$i$个玩具的长度是$c[i]$,要求将玩具分成若干段,从$i$到$j$分为一段的长度为$x=j-i+\sum_{k=i}^{j}c[k]$,费用为$(x-l)^{2}$. 求最小费用 [Link]
分析
用$dp[i]$表示前i个玩具所需的最小费用,则有
$dp[i]=min\left \{ dp[j]+(sum[i]-sum[j]+i-(j+1)-l)^{2}(1<=j<i) \right \}$
其中$sum[i]$表示的是$c[i]$的前缀和.
为了方便,我们设
$A[i]=sum[i]+i,l=l+1$
于是原方程就等价于
$dp[i]=min\left\{dp[j]+(A[i]−A[j]−l)^{2}(1<=j<i)\right\}$
我们设$j<k<i$且在计算$dp[i]$的时候,决策k更优.也就是说
$dp[k]+(A[i]−A[k]−l)^{2}<dp[j]+(A[i]−A[j]−l)^{2}$
在纸上写写画画,把式子打开再变一下形,容易得到
$\frac{[dp[k]+(A[k]+l)^{2}]-[dp[j]+(A[j]+l)^{2}]}{2\times A[k]-2\times A[j]}$ $<A[i]$
是不是很像
$\frac{Y_{k}-Y_{j}}{X_{k}-X_{j}}$
的形式?
这玩意儿不就是斜率吗?!我们设它为$g(k,j)$
我们可以发现$A[i]$是单调递增的,所以所有决策可以转化为二维空间上的点集.
也就是说$k$这个点和j这个点的连线的斜率如果小于$A[i]$,那么$k$这个决策就更优.
那么对于三个决策$a<b<c$,如果有$g(c,b)<=g(b,a)$,那么$b$决策一定不会被选中.为什么呢?我们来讨论一下(对于任意$3<i<=n$):
1.如果$g(b,a)<A[i]$,那么必有$g(c,b)<A[i]$,也就是$c$最优,选择决策$c$.
2.如果$g(b,a)>=A[i]$,那么$b$不是最优,最优可能是$a$或$c$.
所以我们在新加入一个点的时候,就可以把它看作$c$,然后把所有这样的$b$都去掉,直到$g(c,b)>g(b,a)$,所以我们需要处理的斜率是单调递增的.
这样我们就可以用一个单调队列分别维护队首和队尾啦.
Code
#include <cstdio>
#define ll long long
#define Empty (head>=tail)
const int maxn = 5e4+;
ll n, L, head, tail, j;
ll Q[maxn], sum[maxn], s[maxn], f[maxn];
inline double X(ll i) {return s[i];}
inline double Y(ll i) {return f[i]+(s[i]+L-)*(s[i]+L-);}
inline double Rate(ll i,ll k) {return (Y(k)-Y(i))/(X(k)-X(i));}
int main()
{
scanf("%lld%lld", &n, &L);
for (int i = ; i <= n; i++) {
scanf("%lld", &sum[i]);
sum[i] += sum[i-], s[i] = sum[i]+i;
}
head = tail = ; Q[] = ;
for (int i = ; i <= n; i++) {
while(!Empty&&Rate(Q[head],Q[head+])<*s[i]) head++;
j = Q[head]; f[i] = f[j]+(s[i]-s[j]-L-)*(s[i]-s[j]-L-);
while(!Empty&&Rate(Q[tail-],Q[tail])>Rate(Q[tail],i)) tail--;
Q[++tail] = i;
}
printf("%lld\n", f[n]);
}
网上讲了很多数形结合的方法,找截距最小,的确对理解很有帮助,但是可能像这样的对我来说更好理解,另外有些细枝末节的东西没有完全看懂,但是现在没必要纠结.
建议多看些博客,了解不同的想法,慢慢就会理解
这里能用斜率优化是因为A[i]是单调的,至于具体为什么,先不细究
参考文章:
https://www.cnblogs.com/Sunnie69/p/5575464.html
https://www.cnblogs.com/terribleterrible/p/9669614.html
https://www.cnblogs.com/Paul-Guderian/p/7259491.html
https://www.cnblogs.com/Parsnip/p/10323508.html
https://www.cnblogs.com/Tidoblogs/p/11301512.html
[HNOI2008]玩具装箱toy(斜率优化dp)的更多相关文章
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11893 Solved: 5061[Submit][S ...
- 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- P3195 [HNOI2008]玩具装箱TOY 斜率优化dp
传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...
- [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP
题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...
- Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定 ...
- 【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告
题目: 题目在这里 思路与做法: 这题不难想. 首先我们先推出一个普通的dp方程: \(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\) 然后就推一推式子了: ...
- 『玩具装箱TOY 斜率优化DP』
玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...
- [bzoj1010][HNOI2008]玩具装箱toy_斜率优化dp
玩具装箱toy bzoj-1010 HNOI-2008 题目大意:P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...
随机推荐
- 所谓guard进程不能启动
1.网络开关的配置是true还是false? 2.服务里有个循环,所以不用打messagebox也是可以调试的. 3.虽然调式时条件变量已经变化,可以把断点拉到促成这个变化的逻辑路径上. 4.可以在调 ...
- Excel催化剂开源第4波-ClickOnce部署要点之导入数字证书及创建EXCEL信任文件夹
Excel催化刘插件使用Clickonce的部署方式发布插件,以满足用户使用插件过程中,需要对插件进行功能升级时,可以无痛地自动更新推送新版本.但Clickonce部署,对用户环境有较大的要求,前期首 ...
- 《ElasticSearch6.x实战教程》之复杂搜索、Java客户端(下)
第八章-复杂搜索 黑夜给了我黑色的眼睛,我却用它寻找光明. 经过了解简单的API和简单搜索,已经基本上能应付大部分的使用场景.可是非关系型数据库数据的文档数据往往又多又杂,各种各样冗余的字段,组成了一 ...
- 2019杭电多校第二场hdu6601 Keen On Everything But Triangle
Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...
- 四、利用SQL Server 2008 R2创建自动备份计划
(转) 本文主要利用SQL Server 2008 R2自带的"维护计划"创建一个自动备份数据的任务. 首先,启动 Sql Management studio,确保"SQ ...
- dedecms新建内容模型“把数据保存到数据库附加表时出错‘xxx’出错”错误的原因分析和解决方案(转)
把数据保存到数据库附加表 `bc_addonarticle17` 时出错,请把相关信息提交给DedeCms官方.INSERT INTO `bc_addonarticle17`(aid,typeid,r ...
- UTF—8与UTF—8(无bom)格式
BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在U ...
- 深入分析Elastic Search的写入过程
摘要 之前写过一篇ElasticSearch初识之吐槽,不知觉竟然过去了两年了.哎,时光催人老啊.最近又用到了ES,想找找过去的总结文档,居然只有一篇,搞了半年的ES,遇到那么多的问题,产出只有这么点 ...
- CSDN 免积分下载
你可能不相信这个标题,那么打开下面的链接试试吧 ↓↓↓ Github项目 最新功能 ↓↓↓ 0积分资源搜索 0积分资源搜索(备用地址) CSDN资源导出 CSDN资源下载体验群 (每日可免费下载一次) ...
- Linux基础之快照克隆、Xshell优化、Linux历史
今天主要分享4个Linux基础知识,第一个知识是虚拟机快照,第二个是虚拟机克隆,第三个是优化Xshell,第四个是简述Linux历史. 先分享第一个知识——虚拟机快照. 1.4)虚拟机快照 虚拟机快照 ...