DP的优化总结
一、预备知识
\(tD/eD\) 问题:状态 t 维,决策 e 维。时间复杂度\(O(n^{e+t})\)。
四边形不等式:
称代价函数 w 满足凸四边形不等式,当:\(w(a,c)+w(b,d)\le w(b,c)+w(a,d),\ a < b < c < d\)
如下所示,区间1、2对应的 w 之和 ≤ 3、4之和
\llap{\overbrace {\phantom{b\to c\to d}}^2}
\]
- 凸完全单调性:
称矩阵 \(A\) 凸完全单调,当:
\(A(a,c)\ge A(b,c)\Rightarrow A(a,d)\ge A(b,d),\ a < b < c < d\)
如下所示,如果满足1区间对应的 w 比2大,那么可以推出3比4大。
\llap{\underbrace {\underbrace{\phantom{b\to c}}_2\phantom{\to d}}_4}
\]
由四边形不等式可以推出完全单调性,反之不真。
- 区间包含关系单调:w 满足\(w(b,c)\le w(a,d),a\le b\le c\le d\)。
- 决策单调性:\(r_j\)是使得矩阵A 第 j 列最小的行号。若\(A\)满足凸完全单调性可以推出\(r_1\le r_2 \le \cdots \le r_m\),即最小值行号递增。
二、优化方法
1. 利用决策单调性
转移方程:\(f(j)=\min_{i < j}\{f(i)+w(i,j)\}\)
令 \(A(i,j)=f(i)+w(i,j)\)表示状态 j 从上一列的第 i 行转移过来的结果。
w满足凸四边形不等式\(\Rightarrow\)w 是凸完全单调的\(\Rightarrow A\)也是凸完全单调的\(\Rightarrow\)决策单调。
令 d(j) 表示最小的满足第 j 行比前面行优的列编号。
每个决策(行)的作用范围是相互连接且递增的列区间,d(j)就是j作用区间的起点,比如:
111224444,d(1)=1,d(2)=4,d(4)=6
由于决策单调,我们用栈维护\(< d(j),j>\)。每次要做的就是:
- 二分找到d(j)在哪个列区间,弹出后面的区间。
- 在这个列区间里二分计算出d(j)
- 入栈
这样就从\(O(n^2)\)优化到了\(O(n\log_2n)\)。
2. 分治优化
转移方程:\(f(i,j)=\min \{f(i-1,k-1)+w(k,j)\}\)
也是利用决策单调性。
令 d(i, j) 表示 f(i, j) 的最优决策。
\(d(i,j')\le d(i,j) ,j' < j\)
于是可以在d(i, j) 前面的区间遍历寻找d(i', j')。
我们分治的过程 \(solve(opt_L,opt_R,l,r)\) 遍历\(opt_L\)到\(opt_R\) 计算出中点\(m=(l+r)/2\) 的 d(i, m)。
那么所有\(l\le x < m\) 的 d(i, x) 一定是在\([opt_L, d(i,m)]\)区间内,所有\(m < x\le r\)的d(i, x) 一定是在\([d(i,m),opt_R]\)区间内。
所以递归:
solve(optL,d[i][m],l,m-1);
solve(d[i][m],optR,m+1,r);
相关文章:post1
3. 单调队列
转移方程:\(\displaystyle f(i)=\min_{j=b[i]}^{i-1}\{g(j)\} + w(i)\),\(b[i]\)随 i 递增。
若后面的一个决策更优,那么前面的决策就可以删掉。因此单调队列维护决策表:
- 队首出队,直到队首符合范围
- 此时队首就是最优决策
- 计算出的 g(x)如果比队尾优,不断删除队尾,直到g(x)没有更优,则插入队尾。
- \(O(n)\)
4. 斜率优化
转移方程: \(f(i)=\min\{a_{i}\cdot x_{j} + b_{i} \cdot y_{j}\}\)
这是一种数形结合的思想。将每个决策作为一个点\((x_j,y_j)\),画在平面直角坐标系中,于是我们要找的是让\(z=a_{i}\cdot x+ b_{i} \cdot y\) 最小的点。变形得到\(y=-\frac {a_i}{b_i} \cdot x+\frac z {b_i}\)。也就是找一个点,斜率为\(-\frac {a_i} {b_i}\)的直线经过该点时,纵截距最小。
可以发现所有最优决策点在一个凸壳上。
- 如果斜率和 x 都单调,只要用单调队列维护,队尾的删除是因为要维护凸性,队首的删除是因为决策点在凸壳上是单调移动的,当前队首不是最优解,之后也不会是最优解。\(O(n)\)
- 否则,二分可以找到最优决策点。将凸壳上的点连边,斜率是单调递增的,决策 i 插入时,先根据 x 二分找到插入点,然后两边进行 Graham 维护凸性,就是删点。x 不单调时需要用平衡树动态维护凸包。\(O(n\log_2n)\)
- 另外可以用 cdq分治 代替平衡树来做。
- 斜率优化的题一般也可以用分治优化做。
相关文章:
bzoj1492 [NOI2007]货币兑换Cash
5. 凸包优化(Convex Hull Trick)
转移方程:\(f(i)=\min \{f(j)+b_j*a_i\}\)
其实相当于上式\(a_i=1,x_j=f(j),y_j=b_j,b_i=a_i\),因此也可以用斜率优化。
将每个决策\(A(i,j)=\color{blue}{b_j}*a_i+\color{green}{f(j)}\)
作为一条直线\(y=\color{blue} {m_j}*x+\color{green}{c_j}\),当前状态选择的决策就是将\(x=a_i\)带入所有直线,得到最小值的那条直线。
我们用栈维护有效(最小值可能出现在它上面)的直线。
如果\(b_j\)递减,那么相当于不断加入一条斜率更小的直线,它和最后一条直线\(l_1\)的交点如果比\(l_1\)与\(l_2\)的横坐标要更小,则\(l_1\)无效了,从栈中弹出,反复执行直到横坐标不更小或者只剩栈底,此时入栈。这个过程类似维护凸包。
如果\(a_i\)递增,那么每次最小值一定在最后一条直线上。于是复杂度是\(O(n)\)。
相关文章:Convex hull trick
6. 凸包优化2
转移方程:\(f(i,j)=\min \{f(i-1,k)+b_k*a_j\}\)
i 固定时,每个决策\(A(j,k)=\color{blue}{b_k}*a_j+\color{green}{f(i-1,k)}\),作为一条直线\(y=\color{blue} {m_k}*x+\color{green}{c_k}\),那么接下来同上。
故总得复杂度是\(O(kn)\)。
相关文章: post2
7. Knuth优化
转移方程 \(f(i,j)=\min\{f(i,k-1)+f(k,j)\}+w(i,j)\)
- 如果 w 满足四边形不等式和 区间包含单调性,那么 f 也满足四边形不等式。
- 定义 f 取得最优值的决策:\(s(i, j)\),如果 f 满足四边形不等式,则 s 单调:\(s(i,j-1)\le s(i,j) \le s(i+1,j)\)
于是转移方程改写为:
\(f(i,j)=\min\{ f(i,k-1)+f(k,j)\}+w(i,j), s(i,j-1)\le k\le s(i+1,j)\)
由于这个状态转移方程枚举的是区间长度L,假设求f(i,i+L),而每次循环长度之和为
&\sum_{i=1}^{n-L}{s(i+1,i+L)-s(i,i+L-1)}\\
&=s(2,L+1)-s(1,L)+s(3,L+2)-s(2,L+1)+s(4,L+3)-s(3,L+2)..\\
&=s(n-L+1,n)-s(1,L)\le n-1
\end{aligned}
\]
枚举L是的\(O(n)\),于是总的复杂度是\(O(n^2)\)。
Donald E. Knuth 从最优二叉搜索树的数据结构中提出的。
三、题目
凸包优化(CHT)
- BZOJ 1701-Cow School Solution-Video
- SPOJ-APIO2010 Commando
- SPOJ-TRAKA
- SPOJ-BAABO
- SPOJ-ACQUIRE
- SPOJ-NKLEAVES
- cf91e-SkyScrapers (+Data Structures)
- cf311b Cats Transport
- cf660f Bear and Bowling 4
- cf319c Kalila and Dimna in the Logging Industry
- cf631e Product Sum
- cf455e Function
- cf536c Tavas and Pashmaks
- cf377e Cookie Clicker
- cf91e Igloo Skyscraper
- Jump mission | CodeChef
- Contest Page | CodeChef
Knuth 优化
- Spoj-BRKSTRNG
- UVa10003-Cutting Sticks
- UVa10304
- Order-Preserving Codes - gym100212C
- UVa12057
- UVa-12836
分治优化
- cf321e Ciel and Gondolas
- hr-Guardians of the Lunatics
- Chef and Bitwise OR Operation | CodeChef
- SPOJ-NKLEAVES
- hr-mining
- Bicolored Horses
- UVa12524
- cf673e Levels and Regions
- ARC 067D
斜率优化
- BZOJ 1597 [Usaco2008 Mar]土地购买
- BZOJ 3675 [APIO 2014]序列分割
- BZOJ 1010 [HNOI2008]玩具装箱toy
- BZOJ 3437 小P的牧场
- BZOJ 3156 防御准备
- BZOJ 1096 [ZJOI2007]仓库建设
- BZOJ 1911 APIO 2010 Commando
- BZOJ 4518 [SDOI2016] 征途
- HDU 3507
- HDU 3401
- HDU 2191
- HDU 5956 The Elder
平衡树维护动态凸包
- cf70d
- BZOJ 2300(HAOI2011)防线修建
- BZOJ 1492 货币兑换Cash
- HDU 5127 Dogs’ Candies
参考文章:
- Dynamic programming with convexity, concavity and sparsity
- 《算法艺术与信息学竞赛》p149。
- 1D1D动态规划优化初步
- 动态规划算法的优化技巧-毛子青
- dp优化-个人对dp优化的理解
- Dynamic Programming Optimizations
- 斜率优化 二
DP的优化总结的更多相关文章
- 【BZOJ-4518】征途 DP + 斜率优化
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 230 Solved: 156[Submit][Status][ ...
- 【BZOJ-3437】小P的牧场 DP + 斜率优化
3437: 小P的牧场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 705 Solved: 404[Submit][Status][Discuss ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
- 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼
目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...
- HDU3480_区间DP平行四边形优化
HDU3480_区间DP平行四边形优化 做到现在能一眼看出来是区间DP的问题了 也能够知道dp[i][j]表示前 i 个节点被分为 j 个区间所取得的最优值的情况 cost[i][j]表示从i ...
- 动态规划DP的优化
写一写要讲什么免得忘记了.DP的优化. 大概围绕着"是什么","有什么用","怎么用"三个方面讲. 主要是<算法竞赛入门经典>里 ...
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)
http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...
- BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)
[ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在 ...
随机推荐
- EF获取多个数据集以及MySQL分页数据查询优化
背景:MySQL分页查询语句为 ,10; 一般页面还会获取总条数,这时候还需要一条查询总条数语句 , 这样数据库需要执行两次查询操作.MySQL提供了SQL_CALC_FOUND_ROWS追踪总条数的 ...
- 杭电ACM2019--数列有序!
数列有序! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Java 设置PDF文档背景色
一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化以及保护双眼的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括: 设置纯色背景色 设置图 ...
- 山西大同大学教务处学生端--送给学弟,学妹的礼物,可在PC端,手机端操作
解决问题:大同大学教务处官网学生端口一进去就卡住了,点上面一行的菜单无响应 转眼已是四年,想想自己大学即将结束,不由得让人感慨啊.这才刚开学几天,我就听到有同学在因为补考,选课的事情发愁.学校官方的教 ...
- SAP MM 公司间STO里交货单PGI之后自动触发内向交货单功能的实现
SAP MM 公司间STO里交货单PGI之后自动触发内向交货单功能的实现 笔者所在的项目上的公司间STO的流程里,发货公司在做PGI之后系统自动触发收货公司的内向交货单.这个功能是通过交货单的Outp ...
- 四、Snapman多人协作电子表格之——Exprtk脚本
Snapman多人协作电子表格是一个即时工作系统. Snapman中嵌入了Exprtk脚本进行公式数据运算.Exprtk是一种高性能的脚本,经测试它的数据运算性能只比C#和java底20%. 一.Ex ...
- WPF:Webbrowser 捕获关闭事件
有点难描述说的是什么.大概就是下面这个图:窗体中嵌套一个Webbrowser,现在网页请求关闭 响应MessageHook事件: this.webBrowser.MessageHook += webB ...
- SQL优化小技巧
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. 1.使用表的别名(Alias): 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析 ...
- 在Windows 10 x64 编译ReactOS-0.4.5源码并在VMare中运行
1.首先下载ReactOS源码(版本是0.4.5,最新版本0.4.9暂没有编译),然后下载RosBe(版本是2.1.6) 2.将下载好的ReactOS源码包放到指定磁盘的文件夹中,目录路径为英文(重要 ...
- UI对象库-定位元素与程序分离
1.前言 这几天有人问我,UI自动化测试中使用到的页面定位元素应该存放在哪里比较合适?我想说的是如果你使用的是PO设计模式设计测试用例的话,可以把定位元素存在每一个page页面,一个page存放对应的 ...