斜率优化dp学习
用了一堂半的课才彻底搞懂。其他神犇写的博客或多或少有点小bug,所以orzzz不才斗胆重新写一个。
里面大量穿用其他神犇的原话,就不逐一标明出处了。
引用资料 Accept的博客 MathonL的博客

首先是最经典的题的题面。
HDU 3507,很适合的一个入门题。
大概题意就是要输出$N$个数字$a[N]$,输出的时候可以连续连续的输出,每连续输出一串,它的费用是 “这串数字和的平方加上一个常数$M$”。
我们设$dp[i]$表示输出到$i$的时候最少的花费,$S[i]$表示从$a[1]$到$a[i-1]$的数字和。注意这里为了方便起见前缀和与一般的有区别。
则有:$dp[i]=min \left\{ dp[j]+(S[i+1]-S[j])^2+M \right\} (j<i)$
复杂度显然是$O(n^2)$的。对于$500000$的$n$显然过不了。那么我们想,能否在$O(1)$时间内找到所有转移里最优的那个呢?
我们假设在求解$dp[i]$时,存在$j,k(j>k)$使得从$j$转移比从$k$转移更优,那么需要满足条件:
$dp[j]+(S[i+1]-S[j])^2+M<dp[k]+(S[i+1]-S[k])^2+M$
展开上式
$dp[j]+S[i+1]^2-2S[i+1]S[j]+S[j]^2+M<dp[k]+S[i+1]^2-2S[i+1]S[k]+S[k]^2+M$
移项并消去再合并同类项得
$dp[j]-dp[k]+S[j]^2-S[k]^2<2S[i+1](S[j]-S[k])$
把$S[j]-S[k]$除过去,得到
$\frac{dp[j]-dp[k]+S[j]^2-S[k]^2}{S[j]-S[k]}<2S[i+1]$
我们设$f[x]=dp[x]+S[x]^2$,就化成了
$\frac{f[j]-f[k]}{S[j]-S[k]}<2S[i+1]$
即当$(j>k)$时,若$\frac{f[j]-f[k]}{S[j]-S[k]}<2S[i+1]$,则$j$对更新$dp[i]$比$k$更新$dp[i]$优。
休息一下qwq。这个东西好像斜率。
当一个数的$dp$值求完了,它的$f$值也跟着确定,我们就可以在空间中绘制出点$(S[i],f[i])$。这个点代表已经求出$dp$值的一个点。
当我们要求解$dp[t]$时,如果可用的集合里存在这样三个点,位置关系如图所示:

那么显然
$\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}$
这时候他们和$2S[t+1]$的关系有3种:
·$\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}>2S[t+1]$
那么$j$比$i$优,$k$比$j$优。
·$\frac{f[j]-f[k]}{S[j]-S[k]}>2S[t+1]>\frac{f[i]-f[j]}{S[i]-S[j]}$
那么$i$比$j$优,$k$比$j$优。
·$2S[t+1]>\frac{f[j]-f[k]}{S[j]-S[k]}>\frac{f[i]-f[j]}{S[i]-S[j]}$
那么$i$比$j$优,$j$比$k$优。
综上,不管什么样的$S[t+1]$,从$j$转移都不会是最佳方案。那么用一个数据结构维护一个凸包(下凸),每加入一个点就删去一些点,使其维持凸包的形态。最优转移一定在这个凸包中。
但还是不能$O(1)$对吧。在凸包里,谁又是最最优呢?
首先一定数据结构里的凸包一定会是这样的:

假设$\overrightarrow{ji}$的斜率$>2S[t+1]$且$\overrightarrow{kj}$的斜率$<2S[t+1]$从图形特点我们可以发现$j$点比所有比$k$小的点都优,比所有比$i$大的也优。所以对于我们二分查找斜率比$2S[t+1]$小的编号最大的点,就是最优的转移点。由于$S[i]$也满足单调性,我们还可以直接维护一个单调队列就能解决这个问题。
推广一下,如果不等式右侧不是像$S[i+1]$这样的单调函数,二分就好了。
所有小于等于的情况我都没提,想一想就知道了。重要的是思想啊对不对~
(我会说我一道斜率优化题都没做就写了这篇博客吗
upd1:
光会思想没有用啊,,,边界条件的处理很蛋疼的说
还是要自己写几遍qwq
upd2:
更正了一个bug,由@Duan2baka发现。不好好女装居然来看我这篇菜鸡博客。
upd3:
dp式子都写错了。。。感谢@自为风月马前卒指正
upd4:
我这bug也够多了哈。。感谢@belief01指正
upd5:
又改了一处不严谨的地方,感谢@ToRe
如果影响大家曾经的阅读深表歉意~虽然不是老师,但是千万不要误人子弟啊。。
斜率优化dp学习的更多相关文章
- 斜率优化DP学习笔记
先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...
- 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy
本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...
- hdu3507Print Article(斜率优化dp)
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- 【学习笔记】动态规划—斜率优化DP(超详细)
[学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...
- 动态规划专题(五)——斜率优化DP
前言 斜率优化\(DP\)是难倒我很久的一个算法,我花了很长时间都难以理解.后来,经过无数次的研究加以对一些例题的理解,总算啃下了这根硬骨头. 基本式子 斜率优化\(DP\)的式子略有些复杂,大致可以 ...
- HDU-3507Print Article 斜率优化DP
学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...
- 【笔记篇】斜率优化dp(一) HNOI2008玩具装箱
斜率优化dp 本来想直接肝这玩意的结果还是被忽悠着做了两道数论 现在整天浑浑噩噩无心学习甚至都不是太想颓废是不是药丸的表现 各位要知道我就是故意要打删除线并不是因为排版错乱 反正就是一个del标签嘛并 ...
- 一本通提高篇——斜率优化DP
斜率优化DP:DP的一种优化形式,主要用于优化如下形式的DP f[i]=f[j]+x[i]*x[j]+... 学习可以参考下面的博客: https://www.cnblogs.com/Xing-Lin ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
随机推荐
- Java Filter过滤xss注入非法参数的方法
http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: <filt ...
- 状态维持在web层 每层都可以Cache
API网关的开源解决方案那么多,为什么我们却还要选择自研? - SDK.CN - 中国领先的开发者服务平台 https://sdk.cn/news/8001 技术细节Microservice+SOA状 ...
- Linux Shell 文本处理工具集锦--Awk―sed―cut(row-based, column-based),find、grep、xargs、sort、uniq、tr、cut、paste、wc
本文将介绍Linux下使用Shell处理文本时最常用的工具:find.grep.xargs.sort.uniq.tr.cut.paste.wc.sed.awk:提供的例子和参数都是最常用和最为实用的: ...
- 关于HashSet在 java7 与 java8的不同
作者:RednaxelaFX链接:https://www.zhihu.com/question/28414001/answer/40733996来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
- 转:C语言的编译链接过程的介绍
11:42:30 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接 ...
- docker部署Jenkins,以及在Jenkins中使用宿主机的docker/docker-compose命令
使用最新的官方镜像jenkins/jenkins 第一次使用的docker部署jenkins的时候,出现了两个问题: 1.因为用户权限问题挂载/home/jenkins/data到/var/jenki ...
- OCR技术浅探:特征提取(1)
研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究人员对相关的技术研究已久,也有不 ...
- nodejs 异步编程 教程(推荐)
有异步I/O就需要异步编程.本课程将着重讲解在学习node.js中关于异步编程的一些问题,以及如何应对这些问题,帮助node.js初学者快速入门. 地址 http://www.hubwiz.com/c ...
- CTreeView 的教程
整个网上搜了一圈没有好的CTreeView 的教程,所以自己谢谢看. CTreeView 是什么? C打头的东西当然是一个类了. 有类就有继承,他的继承关系如下. 有个东西和他比较像 叫CTreeCt ...
- SQL Server语句创建数据库和表——并设置主外键关系
简单的创建数据库的 SQL 语句: use master go if exists(select * from sysdatabases where name='Test') begin select ...