引言

dpdp所要解决的是多阶段决策问题,它利用递归的思想,将规模为n的问题转化为规模较小的问题,直到转化为小到能够直接求解的子问题。通常来说这样做时间复杂度是指数级的,但是如果所有不同的子问题的数目是多项式级别,那么多项式时间就可以解决这个问题,这就是dpdp的本质
dp有三个要素:dp有三个要素:
(1)所有不同的子问题组成的表(1)所有不同的子问题组成的表
(2)问题解决的依赖关系,这可以看成是一个(2)问题解决的依赖关系,这可以看成是一个
(3)填充子问题表的顺序(实际上是这个图的一个拓扑排序)(3)填充子问题表的顺序(实际上是这个图的一个拓扑排序)
如果状态数量为O(nt),转移需要依赖于其它O(ne)个子问题,那么称这个问题是tD/eD的如果状态数量为O(n^t),转移需要依赖于其它O(n^e)个子问题,那么称这个问题是tD/eD的
这样可以得到四类典型的动态规划方程
1D/1D:已知D[0],方程为1D/1D: 已知D[0],方程为
E[j]=minE[j] = min{D[i]+w(i,j)D[i] + w(i,j)} f(j)≤i<j f(j)\leq i
2D/0D:已知D[i][0]和D[0][j],方程为2D/0D:已知D[i][0]和D[0][j],方程为
E[i][j]=minE[i][j] = min{D[i−1][j]+xi,D[i][j−1]+yi,D[i−1][j−z]+zi,jD[i-1][j]+x_{i}, D[i][j-1]+y_{i}, D[i-1][j-z]+z_{i,j}}
2D/1D:已知D[i][i]=0,方程为2D/1D:已知D[i][i]=0,方程为
E[i][j]=w(i,j)+minE[i][j] = w(i,j)+min{C[i,k−1]+C[k,j]C[i,k-1] + C[k, j]} i<k≤ji
2D/2D:已知D[i,0]和D[0,j],方程为2D/2D:已知D[i,0]和D[0,j],方程为
E[i][j]=minE[i][j] = min{D[i′][j′]+w(i′+j′,i+j)D[i'][j'] + w(i'+j', i+j)} 0≤i′<i,0≤j′<j0 \leq i'
dp问题最直接的算法是O(ne+t)的,但我们不满足与此,于是产生了对应的优化手段dp问题最直接的算法是O(n^{e+t})的,但我们不满足与此,于是产生了对应的优化手段
dpdp优化无外乎状态优化和转移优化两种手段,状态优化往往依赖于具体题目而变,我们主要研究的是转移优化,转移优化常见的手段有:斜率优化,四边形不等式优化和具体数据结构优化等等,还有一类特殊的针对递推线性的优化即矩阵乘法

一些准备知识

移动窗口:单调队列简介

单调队列是应对较为简单的具有单调性的问题的有力手段,而单调队列的使用不外乎下面五个要点
(1)维护区间最值:维护一段区间内的最优决策(1)维护区间最值:维护一段区间内的最优决策
(2)区间出现平移:拓展地来看,区间左右端点都单调即可(2)区间出现平移:拓展地来看,区间左右端点都单调即可
(3)去除无用状态:显然如果在某一时刻决策i比决策j先出现,并且决策i比决策j劣,那么在j出现后我无论如何都不会选择决策i,决策i在此之后就是无用的(3)去除无用状态:显然如果在某一时刻决策i比决策j先出现,并且决策i比决策j劣,那么在j出现后我无论如何都不会选择决策i,决策i在此之后就是无用的
(4)保持队列单调(4)保持队列单调:由前面我们知道,队列里的决策时刻满足后面的决策比前面的决策后出现,且更劣
(5)(5)最优选择在队首:如果后面有一个决策比队首更优,那么它将成为队首,由队列的单调性也可知这一点

动态凸壳:平衡树的应用

前面提到这里的单调性经常与凸包挂钩,而我们时常要维护的是决策点在决策平面上的一个上凸壳或是下凸壳
维护一个凸壳我们通常会使用平衡树,对于一个点(x,y),我们以x为平衡树的关键字维护,每次插入点就查找前驱后继,然后利用凸性质删去左右不符合要求的点即可维护一个凸壳我们通常会使用平衡树,对于一个点(x,y),我们以x为平衡树的关键字维护,每次插入点就查找前驱后继,然后利用凸性质删去左右不符合要求的点即可

动态凸壳:神器的CDQ分治

在动态凸壳问题中我们还可以用CDQ分治来解决,这里不多赘述了。

1D/1D优化 f[i]=minf[i] = min{f[j]+w(i,j)f[j] + w(i,j)}

第一种情况:分离决策与状态

这一类优化针对的是这样一类w(i,j)w(i, j)
w(i,j)=μ(i)+ϕ(j)w(i,j)=\mu(i)+\phi(j)
也就是说w(i,j)可以拆成分别只与i有关的函数μ和只与j有关的函数ϕw(i,j)可以拆成分别只与i有关的函数\mu 和只与j有关的函数\phi

(1)f(j)单调,就符合了我们前面所说的单调队列优化,直接用即可f(j)单调,就符合了我们前面所说的单调队列优化,直接用即可
(2)f(j)不单调,即一个普通的区间最值查询,需要线段树这样的数据结构来维护了f(j)不单调,即一个普通的区间最值查询,需要线段树这样的数据结构来维护了

第二种情况:斜率优化

这一类优化针对的是这样一类方程
f(i)=minf(i) = min{ai∗xj+bi∗yja_{i}*x_{j} + b_{i} * y_{j}}

对于每一个决策j来说,xj,yj是唯一确定的,我们对于每一个决策j来说,x_{j},y_{j}是唯一确定的,我们将每一个决策视作一个点(xj,yj),画在决策平面上(x_{j}, y_{j}),画在决策平面上
现在我们的决策平面上有很多点,那么我要寻找的是这样一个点使得
P=ai∗x+bi∗y最小P = a_{i}*x + b_{i} * y最小
我们将这个式子变形,有
y=−aibi+Pbiy = \frac{-a_{i}}{b_{i}}+\frac{P}{b_{i}}
这个式子代表的是一个直线,这个直线过决策点(x,y)(x,y),且斜率为一个定值,而PP最优就意味着纵轴截距最优,也就是说,现在我过每一个决策点作一条相同斜率的直线,求纵轴截距最优的那个点
显然这个点只可能存在于所有点的凸壳上(具体是上凸壳还是下凸壳视情况而定),在凸壳上寻找这个点我们只需要二分斜率即可(斜率单调的话直接可以用第一个点或最后一个点),而维护凸壳我们使用平衡树即可(如果横坐标单调就不用这么麻烦了,使用单调队列即可)

第三种情况:决策单调性优化

这一类优化针对的是这样一类方程这一类优化针对的是这样一类方程
f(i)=min(f(j)+w(i,j))f(i) = min(f(j) + w(i,j))
且w(i,j)满足这样一个凸不等式且w(i,j)满足这样一个凸不等式
w(i,j+1)−w(i,j)>=w(i+1,j+1)−w(i+1,j)w(i,j+1)-w(i,j) >= w(i+1,j+1)-w(i+1,j)
此时我们称w是凸的此时我们称w是凸的
注:满足这个不等式就意味着w满足四边形不等式,下面会提到

满足这个不等式等价于
用k(x)表示状态x的最优决策,对任意i≤j,有k(i)≤k(j)用k(x)表示状态x的最优决策,对任意i \leq j, 有k(i) \leq k(j)

这样,我们可以使用一个栈来维护数据,栈中的每一个元素保存每一个决策是最优的起始位置和终止位置(这显然是一个区间,我们称之为这个决策的作用区间),显然这些区间相互连接且递增
首先我们要寻找最优决策就是要寻找当前状态在哪个决策的作用区间里,由区间的单调性我们二分即可
每次我们还要加入一个新决策,我们从后往前扫描栈,扫到一个老决策的时候,我们做这样两件事:
(1)(1)如果这个老决策的作用区间的起始位置仍然不如新决策优,那么我们弹出老决策,将老决策的作用区间整个合并到新决策中,继续往前扫
(2)(2)如果不满足前面的条件,在老决策的作用区间中二分出新决策起作用的起始位置,将老决策分割,新决策入栈,结束扫描过程

2D/1D优化:四边形不等式优化f(i,j)=w(i,j)+minf(i,j) = w(i,j)+min{f(i,k−1)+f(k,j)f(i,k-1) + f(k,j)}

四边形不等式
假如对于i<i′<j<j′,有w(i,j)+w(i′,j′)≤w(i′,j)+w(i,j′),则称w满足四边形不等式假如对于i
区间包含关系的单调性
假如对于i<i′<j<j′,有w(i′,j)≤w(i,j′),则称w满足区间包含关系的单调性假如对于i
【定理1】
如果w满足四边形不等式,那么f也满足四边形不等式如果w满足四边形不等式,那么f也满足四边形不等式

我们定义s(i,j)为f(i,j)的最优决策s(i,j)为f(i,j)的最优决策
【定理2】
s(i,j−1)≤s(i,j)≤s(i+1,j)s(i,j-1) \leq s(i,j) \leq s(i+1, j)

这样转移方程从原来的
f(i,j)=w(i,j)+minf(i,j) = w(i,j)+min{f(i,k−1)+f(k,j)f(i,k-1) + f(k,j) } i≤k≤ji\leq k\leq j
变成了
f(i,j)=w(i,j)+minf(i,j) = w(i,j)+min{f(i,k−1)+f(k,j)f(i,k-1) + f(k,j) } s(i,j−1)≤k≤s(i+1,j)s(i,j-1)\leq k \leq s(i+1,j)
复杂度从O(n3)变成了O(n2)O(n^3)变成了O(n^2)

线性递推优化:矩阵乘法

一般地,对于mm项递推式,我们记递推式为
fn+m=∑m−1i=0bifn+if_{n+m} = \sum_{i=0}^{m-1}b_{i}f_{n+i}

我们就可以把递推式写成如下矩阵形式

⎡⎣⎢⎢⎢⎢an+man+m−1⋮an+1⎤⎦⎥⎥⎥⎥

\begin{bmatrix}a_{n+m}\\a_{n+m-1}\\\vdots\\a_{n+1}\end{bmatrix}

==

⎡⎣⎢⎢⎢⎢⎢⎢⎢bm−110⋮0bm−201⋮0⋯⋯⋯⋱⋯b100⋮1b000⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥

\left[ \begin{matrix}b_{m-1} & b_{m-2} & \cdots & b_{1} &b_{0} \\1 & 0 & \cdots & 0 &0 \\0 & 1 & \cdots & 0 &0 \\\vdots & \vdots & \ddots & \vdots &\vdots \\0 & 0 & \cdots & 1 &0 \\ \end{matrix} \right]

×

⎡⎣⎢⎢⎢⎢an+m−1an+m−2⋮an⎤⎦⎥⎥⎥⎥

\begin{bmatrix}a_{n+m-1}\\a_{n+m-2}\\\vdots\\a_{n}\end{bmatrix}

然后就可以在O(m3logn)O(m^3logn)时间内解决

[dp优化]个人对dp优化的理解相关推荐

  1. dp笔记:关于DP算法和滚动数组优化的思考

    从网上总结了一些dp的套路以及对滚动数组的一些思考,现记录如下,希望以后回顾此类算法时会有所帮助. 目录 1.DP算法经验 1.DP算法核心: 2.DP算法类别以及例题 例1:三步问题 例2:最小路径 ...

  2. 01背包:经典DP问题( 基本/滚动数组(优化)/恰好装满 )

    所谓01背包问题,是指对于一定数量( i )的物品有一个容量为( j )的背包,每个物品都有自己的容量( k ).价值(value).在保证物品容量之和不大于背包容量的前提下,如何选取物品得到最大价值 ...

  3. 【HDU 5542】The Battle of Chibi (dp,树状数组优化)

    目录 题目 Description Input Output Sample Input Sample Output Hint Source 思路 朴素dp 优化 代码 题目 Description C ...

  4. 【Gym - 101196F】Removal Game (环形区间dp,环状,细节优化)

    题干: 健健开发了一个游戏叫做<<者护守形隐>>,里面有一个情节是这样的,女主子纯藤武被坏人关在了密室里,作为男主的肖健当然要英雄救美.但是要打开密室的门,必须解开一道谜题. ...

  5. DL之DNN优化技术:DNN优化器的参数优化—更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解、图表可视化比较

    DL之DNN优化技术:DNN优化器的参数优化-更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解.图表可视化比较 目录 四种最优化方法简介 优化器案例理解 输出结 ...

  6. 递归循环一个无限极数组_理解递归、尾调用优化和蹦床函数优化

    想要理解递归,您必须先理解递归.开个玩笑罢了, 递归 是一种编程技巧,它可以让函数在不使用 for 或 while 的情况下,使用一个调用自身的函数来实现循环. 例子 1:整数总和 例如,假设我们想要 ...

  7. SEO优化是什么意思,如何理解并学好它

    到许多人在百度知道.百度贴吧甚至等等地方提问:SEO是什么意思?这个时候许多朋友认为这是一个非常奇葩的问题. 记得我前两天去深圳一个医院应聘SEO技术支持的时候,我和医院前台说我应聘的职业是SEO,前 ...

  8. java dp处理_Java-对DP解决方案的硬币更改理解

    我做运动: "You are given coins of different denominations and a total amount of money amount. Write ...

  9. c语言dp算法,C++动态规划dp算法题

    问题1:找硬币,换钱的方法 输入: penny数组代表所有货币的面值,正数不重复 aim小于等于1000,代表要找的钱 输出: 换钱的方法总数 解法1:经典dp,空间复杂度O(n*aim) class ...

最新文章

  1. Linux-lsof命令
  2. Android中ImageView常用属性含义
  3. HaaS 物联网极客大赛来了!奖金丰厚等你来!
  4. UnitTest in .NET(Part 4)
  5. 02-MyBatis配置SQL打印
  6. Web前端文档阅读笔记-vis.js动态添加节点(vue cli环境)
  7. Failed to issue method call Unit mysql service failed to lo
  8. 1.4. trac.ini
  9. vue-cli中引入jquery的方法
  10. 只需8招,搞定Pandas数据筛选与查询
  11. 通过注册表永久禁用系统UAC功能
  12. 偏最小二乘法(R语言)
  13. Android自动化测试框架Robotium
  14. 洛谷P1005 [NOIP2007 提高组] 矩阵取数游戏
  15. Sprint周期开发总结
  16. windows 8 .1全家桶(很详细)
  17. domian index域索引和全文索引
  18. 计算机专业转段考试,计算机信息技术学院完成计算机网络技术专业3+2本科转段考试工作...
  19. 皮卡丘(pikachu)敏感信息泄露
  20. c语言开机自启动 linux_Linux开机启动程序rc.local

热门文章

  1. hud.java_什么是HUD
  2. JAVA经典算法大全
  3. JMockit @mocked 注释标签
  4. Linux内核实战(二)-操作系统概述
  5. 用Moment.js 计算两个时间直接的间隔
  6. 推荐9款最佳的编程字体
  7. 数据标注软件 【labelimg】
  8. 12306网站服务器时间限制,12306网上订票时间限制
  9. 18岁创业从哪入手?读透这5点则事半功倍!
  10. 解开Kafka神秘的面纱(二):Kafka的高效读写与消息安全