对于某一类型的dp方程
其中 a[x],b[x],c[x],d[x] 是关于 x 的函数,且 b 单增。 ——————【1】
按照一贯的套路,先数学归纳法证明决策单调性。
1.归纳假设:
假设有 i 前两个决策点 j,k(j<k) ,且 k 的决策要比 j 好,即:
2.归纳推理:
此时后面有状态 i+1 ,这里我们为了简单起见,不妨设 a[i+1]=a[i]−v,v>0 ,也就是 a 单调递减。
所以,决策单调性是存在的。我们将由决策单调性得出的式子展开,化成斜率式:
记斜率
然后发现这个东西很符合单调队列的特性:
−a[i]>=slope(q[l],q[l+1])
。因为
q[l]
在
q[l+1]
之前加入,那么显然这个式子就表示
q[l]
决策不如
q[l+1]
优,我们可以将队首pop掉。
slope(q[r−1],q[r])>slope(q[r],i)
。假设我们在后面存在一个
a[t]
使得
−a[t]>=slope(q[r−1],q[r])
那么等到pop了
q[r−1]
之后,
−a[t]
一定也会
>=slope(q[r],i)
,
q[r]
也会被pop。所以说
q[r]
实际上是无用的,我们可以直接将它pop掉。
问题就这样优化到了
O(n)
。
回顾一下我们之所以可以使用斜率优化,是因为这个dp方程具有决策单调性;否则我们推不出斜率式。之后我们将决策单调性的式子变形为斜率式,当满足斜率式的时候就表明前一个决策不如后一个决策优,一切都是围绕着决策单调性开展的,可以说决策单调性是斜率优化的前提。