一、预备知识

  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. c#用winform开发一个简易双色球项目

    开始画面 抽奖中: 抽奖结果: 需要一个随机数Random的帮助类,让随机数唯一性 public class RandomHelper { public int GetNum(int min, int ...

  2. Asp.Net MVC Unobtrusive Ajax

    1.   Unobtrusive JavaScript介绍 说到Unobtrusive Ajax,就要谈谈UnobtrusiveJavaScript了,所谓Unobtrusive JavaScript ...

  3. Linux journalctl命令

    在Systemd出现之前,Linux系统及各应用的日志都是分别管理的,Systemd开始统一管理了所有Unit的启动日志,这样带来的好处就是可以只用一个 journalctl命令,查看所有内核和应用的 ...

  4. 在表单提交之前做校验-利用jQuery的submit方法

    点击表单中的提交按钮,默认就会提交表单,如果要在表单提交之前做一些校验,那么就可以用jQuery的submit方法. 也就是jQuery的submit的方法执行顺序,在表单的提交之前.用法如下: $( ...

  5. 设计模式系列6:适配器模式(Adapter Pattern)

    定义 将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.    --<设计模式>GoF UML类图 使用场景 在遗留代码复用,类 ...

  6. 原生JS替代jQuery的各种方法汇总

    前端发展很快,现代浏览器原生 API 已经足够好用.我们并不需要为了操作 DOM.Event 等再学习一下 jQuery 的 API.同时由于 React.Angular.Vue 等框架的流行,直接操 ...

  7. Java实现"命令式"简易文本编辑器原型

    源自早先想法, 打算从界面方向做些尝试. 找到个简单文本编辑器的实现: Simple Text Editor - Java Tutorials. 原本的菜单/按钮界面如下. 包括基本功能: 新建/打开 ...

  8. java压缩指定目录下的所有文件和文件夹的代码

    将代码过程较好的代码段备份一下,下边资料是关于java压缩指定目录下的所有文件和文件夹的代码,希望对码农有帮助. String sourceDir="E:\test";int pa ...

  9. 通过maven profile 打包指定环境配置

    背景 最近换了个新公司接手了一个老项目,然后比较坑的是这个公司的项目都没有没有做多环境打包配置,每次发布一个环境都要手动的去修改配置文件.今天正好有空就来配置下. 解决这个问题的方式有很多,我这里挑选 ...

  10. [20190416]查看shared latch gets的变化.txt

    [20190416]查看shared latch gets的变化.txt 1.环境:SYS@book> @ ver1PORT_STRING                    VERSION  ...