斜率优化

什么是斜率优化?

通常我们在做动态规划的时候,会遇到如下形式的方程

$\Large f(i)=min(f(j)+w(j,i))$

对于i来说,什么时候取j比取t要好呢?

显然是当$f(j)+w(j,i)\le f(t)+w(t,i)$时

如果我们可以将式子化简成$\large\frac{A(j)-A(t)}{B(j)-B(t)}\le C(i)$(一侧与i无关,一侧只与i有关)的形式,且C是单调的

设$value(t,j)=\large\frac{A(j)-A(t)}{B(j)-B(t)}$

我们就可以维护一个关于value的单调队列从而快速求出i的决策

具体做法

每次向队列中加入一个元素时,算一下它和队尾元素的value

如果这个值$\le$队尾和队中倒数第二个元素的value就弹出队尾元素
(当队尾元素比队中倒数第二个元素优时,要加入的元素就已经比队尾元素优了)

如果队首两个元素的value$\le$当前的C(i)时,弹出第一个元素

名字来源

如果我们把(A(j),B(j))当成二维平面上的一个点

那么value就是两个点直线的斜率

单调队列中相邻两个点的斜率是单调递增的,如下图

其实就是维护了一个下凸壳,所以说是斜率优化

例题

BZOJ1010: [HNOI2008]玩具装箱toy     思路

HDU3480 Division                                思路

BZOJ1096: [ZJOI2007]仓库建设           思路

BZOJ1597: [Usaco2008 Mar]土地购买 思路

posted @ 2018-05-24 07:44  Bennettz  阅读(154)  评论(0编辑  收藏  举报