一、预备知识

  1. \(tD/eD\) 问题:状态 t 维,决策 e 维。时间复杂度\(O(n^{e+t})\)。

  2. 四边形不等式:

    称代价函数 w 满足凸四边形不等式,当:\(w(a,c)+w(b,d)\le w(b,c)+w(a,d),\ a < b < c < d\)

    如下所示,区间1、2对应的 w 之和 ≤ 3、4之和

\[\underbrace {\overbrace {a \to \underbrace{b \to c}_3}^1 \to d }_4
\llap{\overbrace {\phantom{b\to c\to d}}^2}
\]

  1. 凸完全单调性:

称矩阵 \(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大。

\[\overbrace {\overbrace {a \to b \to c}^1 \to d }^3
\llap{\underbrace {\underbrace{\phantom{b\to c}}_2\phantom{\to d}}_4}
\]

由四边形不等式可以推出完全单调性,反之不真。

  1. 区间包含关系单调:w 满足\(w(b,c)\le w(a,d),a\le b\le c\le d\)。
  2. 决策单调性:\(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)\)

  1. 如果 w 满足四边形不等式和 区间包含单调性,那么 f 也满足四边形不等式。
  2. 定义 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),而每次循环长度之和为

\[\begin{aligned}
&\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 从最优二叉搜索树的数据结构中提出的。

相关文章:1 2

三、题目

凸包优化(CHT)

  1. BZOJ 1701-Cow School Solution-Video
  2. SPOJ-APIO2010 Commando
  3. SPOJ-TRAKA
  4. SPOJ-BAABO
  5. SPOJ-ACQUIRE
  6. SPOJ-NKLEAVES
  7. cf91e-SkyScrapers (+Data Structures)
  8. cf311b Cats Transport
  9. cf660f Bear and Bowling 4
  10. cf319c Kalila and Dimna in the Logging Industry
  11. cf631e Product Sum
  12. cf455e Function
  13. cf536c Tavas and Pashmaks
  14. cf377e Cookie Clicker
  15. cf91e Igloo Skyscraper
  16. Jump mission | CodeChef
  17. Contest Page | CodeChef

Knuth 优化

  1. Spoj-BRKSTRNG
  2. UVa10003-Cutting Sticks
  3. UVa10304
  4. Order-Preserving Codes - gym100212C
  5. UVa12057
  6. UVa-12836

分治优化

  1. cf321e Ciel and Gondolas
  2. hr-Guardians of the Lunatics
  3. Chef and Bitwise OR Operation | CodeChef
  4. SPOJ-NKLEAVES
  5. hr-mining
  6. Bicolored Horses
  7. UVa12524
  8. cf673e Levels and Regions
  9. ARC 067D

斜率优化

  1. BZOJ 1597 [Usaco2008 Mar]土地购买
  2. BZOJ 3675 [APIO 2014]序列分割
  3. BZOJ 1010 [HNOI2008]玩具装箱toy
  4. BZOJ 3437 小P的牧场
  5. BZOJ 3156 防御准备
  6. BZOJ 1096 [ZJOI2007]仓库建设
  7. BZOJ 1911 APIO 2010 Commando
  8. BZOJ 4518 [SDOI2016] 征途
  9. HDU 3507
  10. HDU 3401
  11. HDU 2191
  12. HDU 5956 The Elder

平衡树维护动态凸包

  1. cf70d
  2. BZOJ 2300(HAOI2011)防线修建
  3. BZOJ 1492 货币兑换Cash
  4. HDU 5127 Dogs’ Candies

参考文章:

  1. Dynamic programming with convexity, concavity and sparsity
  2. 《算法艺术与信息学竞赛》p149。
  3. 1D1D动态规划优化初步
  4. 动态规划算法的优化技巧-毛子青
  5. dp优化-个人对dp优化的理解
  6. Dynamic Programming Optimizations
  7. 斜率优化 二

DP的优化总结的更多相关文章

  1. 【BZOJ-4518】征途 DP + 斜率优化

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][ ...

  2. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  3. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  4. 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼

    目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...

  5. HDU3480_区间DP平行四边形优化

    HDU3480_区间DP平行四边形优化 做到现在能一眼看出来是区间DP的问题了 也能够知道dp[i][j]表示前  i  个节点被分为  j  个区间所取得的最优值的情况 cost[i][j]表示从i ...

  6. 动态规划DP的优化

    写一写要讲什么免得忘记了.DP的优化. 大概围绕着"是什么","有什么用","怎么用"三个方面讲. 主要是<算法竞赛入门经典>里 ...

  7. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

    题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...

  8. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  9. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

  10. BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)

    [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在 ...

随机推荐

  1. EF获取多个数据集以及MySQL分页数据查询优化

    背景:MySQL分页查询语句为 ,10; 一般页面还会获取总条数,这时候还需要一条查询总条数语句 , 这样数据库需要执行两次查询操作.MySQL提供了SQL_CALC_FOUND_ROWS追踪总条数的 ...

  2. 杭电ACM2019--数列有序!

    数列有序! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. Java 设置PDF文档背景色

    一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化以及保护双眼的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括: 设置纯色背景色 设置图 ...

  4. 山西大同大学教务处学生端--送给学弟,学妹的礼物,可在PC端,手机端操作

    解决问题:大同大学教务处官网学生端口一进去就卡住了,点上面一行的菜单无响应 转眼已是四年,想想自己大学即将结束,不由得让人感慨啊.这才刚开学几天,我就听到有同学在因为补考,选课的事情发愁.学校官方的教 ...

  5. SAP MM 公司间STO里交货单PGI之后自动触发内向交货单功能的实现

    SAP MM 公司间STO里交货单PGI之后自动触发内向交货单功能的实现 笔者所在的项目上的公司间STO的流程里,发货公司在做PGI之后系统自动触发收货公司的内向交货单.这个功能是通过交货单的Outp ...

  6. 四、Snapman多人协作电子表格之——Exprtk脚本

    Snapman多人协作电子表格是一个即时工作系统. Snapman中嵌入了Exprtk脚本进行公式数据运算.Exprtk是一种高性能的脚本,经测试它的数据运算性能只比C#和java底20%. 一.Ex ...

  7. WPF:Webbrowser 捕获关闭事件

    有点难描述说的是什么.大概就是下面这个图:窗体中嵌套一个Webbrowser,现在网页请求关闭 响应MessageHook事件: this.webBrowser.MessageHook += webB ...

  8. SQL优化小技巧

    我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. 1.使用表的别名(Alias): 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析 ...

  9. 在Windows 10 x64 编译ReactOS-0.4.5源码并在VMare中运行

    1.首先下载ReactOS源码(版本是0.4.5,最新版本0.4.9暂没有编译),然后下载RosBe(版本是2.1.6) 2.将下载好的ReactOS源码包放到指定磁盘的文件夹中,目录路径为英文(重要 ...

  10. UI对象库-定位元素与程序分离

    1.前言 这几天有人问我,UI自动化测试中使用到的页面定位元素应该存放在哪里比较合适?我想说的是如果你使用的是PO设计模式设计测试用例的话,可以把定位元素存在每一个page页面,一个page存放对应的 ...