斜率优化动态规划

斜率优化是一种用于加速具有特定形式的状态转移方程的动态规划方法。通过将方程式转换为斜率不变的直线形式,利用单调队列维护决策点,从而达到优化时间复杂度的目的。在某些情况下,即使斜率不确定或决策点的横坐标不单调递增,也能通过调整策略进行优化。这种方法常用于解决最优化问题,例如经典例题中的应用。


  • 斜 率 优 化 的 作 用 斜率优化的作用

F i = min ⁡ (   F j + s i 2 + ( s j + L ) 2 − 2 s i ( s j + L )   ) F_i = \min(\ F_j + s_i^2+(s_j+L)^2-2s_i(s_j+L) \ ) Fi=min( Fj+si2+(sj+L)22si(sj+L) )

形如这个式子 关于i的项关于j的项 混杂(相乘) 的状态转移方程, 可以使用斜率优化来加速 .

接下来以优化这个式子为例说说斜率优化.


  • 斜 率 优 化 的 内 容 斜率优化的内容

将上方给出的式子去掉 m i n min min, 仅关于 j j j的项放在左边, 关于 i i i的项放在右边得 ↓ ↓

F j + ( s j + L ) 2 = 2 s i s j + F i − s i 2 + 2 L s i F_j+(s_j+L)^2=2s_i s_j+F_i-s_i^2+2Ls_i Fj+(sj+L)2=2sisj+Fisi2+2Lsi

这个时候原式为 y = k x + b y=kx+b y=kx+b 的形式, 其中

  • y = F j + ( s j + L ) 2 y=F_j+(s_j+L)^2 y=Fj+(sj+L)2
  • k = 2 s i k=2s_i k=2si
  • x = s j x=s_j x=sj
  • b = F i − s i 2 + 2 L s i b=F_i-s_i^2+2Ls_i b=Fisi2+2Lsi

∵ j ∈ [ 1 , i ) \because j∈[1,i) j[1,i) 且为一个单调递增的正整数数列
∴ x , y \therefore x,y x,y都随 j j j 单调递增.
∵ k \because k k 始终不变
∴ \therefore 上式代表了一个 斜率不变, 随着经过点 ( x , y ) (x,y) (x,y)的变化, 截距也随之变化的直线 .

暂且称 ( x , y ) (x,y) (x,y) 代表的点为 决策点,

由于单调递增, 决策点 构成的图象为 下凸壳 , 这里给出概念图.

备注: k b c &lt; k c d k_{bc}&lt;k_{cd} kbc<kcd .

我们需要 截距 b b b 最小进而使答案最优, 即找到一个最优的 决策点 .

找 到 第 一 条 斜 率 大 于 k 的 线 段 , 过 左 端 点 的 直 线 截 距 即 为 最 小 值 . \color{red}{找到第一条 斜率 大于 k 的线段, 过左端点的直线 截距 即为最小值 .} k线,线.


  • 斜 率 优 化 的 实 现 斜率优化的实现

使用 单调队列 维护, 没学过的可以看 这里 了解一下,
具体地说:
对上转移方程, 应当维护斜率从队首到队尾的单调递增队列,

设当前是第 i i i 个点,

  1. 不断弹出队首, 直到 队首次队首 的斜率大于等于 k k k 或 队列长度为 1 1 1 , 队首即为当前最优的 决策点 .
  2. 不断弹出队尾, 直到 队尾次队尾 的斜率小于 次队尾 i i i 的斜率, 将第 i i i 个点从队尾入队(对后面来说新的决策) .

时间复杂度 O ( N ) O(N) O(N) .

经典例题


  • 斜 率 优 化 的 变 形 斜率优化的变形

  1. k k k不确定正负, 此时不能弹出队首, 但是仍然可以维护单调性, 二分查找来弥补, 时间复杂度 O ( N l o g N ) O(NlogN) O(NlogN) , 例题 , 下有数学解释 .
  2. 决策点的横坐标不单调递增, 需要在任意位置插入决策点, 待 填 坑 \color{red}{待填坑} .

  • 相 关 数 学 推 导 补 充 相关数学推导补充

该题 的式子为例, (已经去掉 min ⁡ \min min),

F [ i ] = F [ j ] + s t [ i ] ∗ ( s c [ i ] − s c [ j ] ) + S ∗ ( s c [ N ] − s c [ j ] ) F[i] = F[j]+s_t[i]*(s_c[i]-s_c[j])+S*(s_c[N]-s_c[j]) F[i]=F[j]+st[i](sc[i]sc[j])+S(sc[N]sc[j])

设 决策 j j j 比 决策 k k k 优, 则
F [ j ] + s t [ i ] ∗ ( s c [ i ] − s c [ j ] ) + S ∗ ( s c [ N ] − s c [ j ] ) &lt; F [ k ] + s t [ i ] ∗ ( s c [ i ] − s c [ k ] ) + S ∗ ( s c [ N ] − s c [ k ] ) F[j]+s_t[i]*(s_c[i]-s_c[j])+S*(s_c[N]-s_c[j])&lt;F[k]+s_t[i]*(s_c[i]-s_c[k])+S*(s_c[N]-s_c[k]) F[j]+st[i](sc[i]sc[j])+S(sc[N]sc[j])<F[k]+st[i](sc[i]sc[k])+S(sc[N]sc[k])
化简得
F [ j ] − F [ k ] s c [ j ] − s c [ k ] &lt; S + s t [ i ] \frac{F[j]-F[k]}{s_c[j]-s_c[k]}&lt;S+s_t[i] sc[j]sc[k]F[j]F[k]<S+st[i] .
s t [ i ] s_t[i] st[i] 单调递增, 则 j j j 在以后不可能比 k k k 更优了, 所以可以执行弹出队首的操作 .
否则 j j j 可能在以后的某一个决策中比 k k k 更优, 不能直接弹出队首 .


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值