斜率优化DP

 对于某一类型的dp方程

f[i]=Min(a[i]b[j]+c[j]+d[i])

  其中 a[x],b[x],c[x],d[x] 是关于 x 的函数,且 b 单增。 1

  按照一贯的套路,先数学归纳法证明决策单调性。
1.归纳假设:

    假设有 i 前两个决策点 j,k(j<k) ,且 k 的决策要比 j 好,即:

a[i]b[j]+c[j]+d[i]>=a[i]b[k]+c[k]+d[i]j<k2

  2.归纳推理:

    此时后面有状态 i+1 ,这里我们为了简单起见,不妨设 a[i+1]=a[i]v,v>0 ,也就是 a 单调递减。

a[i+1]b[j]+c[j]+d[i+1]>=a[i+1]b[k]+c[k]+d[i+1]

(a[i]v)b[j]+c[j]+d[i+1]>=(a[i]v)b[k]+c[k]+d[i+1]

a[i]b[j]+vb[k]+c[j]>=a[i]b[k]+vb[j]+c[k]

 

2a[i]b[j]+c[j]>=a[i]b[k]+c[k]

1b[k]>b[j]

v>0

vb[k]>=vb[j]

  所以,决策单调性是存在的。我们将由决策单调性得出的式子展开,化成斜率式:
  

a[i]b[j]+c[j]+d[i]>=a[i]b[k]+c[k]+d[i]j<k

a[i]>=c[k]c[j]b[k]b[j]

  记斜率

slope(i,j)=c[k]c[j]b[k]b[j]

  然后发现这个东西很符合单调队列的特性:

a[i]>=slope(q[l],q[l+1]) 。因为 q[l] q[l+1] 之前加入,那么显然这个式子就表示 q[l] 决策不如 q[l+1] 优,我们可以将队首pop掉。
slope(q[r1],q[r])>slope(q[r],i) 。假设我们在后面存在一个 a[t] 使得 a[t]>=slope(q[r1],q[r]) 那么等到pop了 q[r1] 之后, a[t] 一定也会 >=slope(q[r],i) q[r] 也会被pop。所以说 q[r] 实际上是无用的,我们可以直接将它pop掉。
  问题就这样优化到了 O(n)

  回顾一下我们之所以可以使用斜率优化,是因为这个dp方程具有决策单调性;否则我们推不出斜率式。之后我们将决策单调性的式子变形为斜率式,当满足斜率式的时候就表明前一个决策不如后一个决策优,一切都是围绕着决策单调性开展的,可以说决策单调性是斜率优化的前提。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值