fi
=min(
fj+s
i2+(
sj+l
)2−2
si(s
j+l)
)fi
=min(f
j+s
i2+
(sj
+l)2
−2si
(sj
+l)
)形如這個式子關於i的項與關於j的項混雜(相乘) 的狀態轉移方程, 可以使用斜率優化來加速 .
接下來以優化這個式子為例說說斜率優化.
將上方給出的式子去掉 min
min, 僅關於j
j的項放在左邊, 關於i
i的項放在右邊得 ↓↓f
j+(s
j+l)
2=2s
isj+
fi−s
i2+2
lsif
j+(
sj+
l)2=
2si
sj+
fi−
si2
+2ls
i這個時候原式為 y=k
x+by
=kx+
b 的形式, 其中∵j
∈[1,
i)∵j
∈[1,
i)且為乙個單調遞增的正整數數列∴x
,y∴x
,y都隨 j
j 單調遞增.
又 ∵k∵k
始終不變∴∴
上式代表了乙個斜率不變, 隨著經過點(x,
y)(x
,y)的變化,截距也隨之變化的直線 .
暫且稱 (x,
y)(x
,y) 代表的點為決策點,
由於單調遞增,決策點構成的圖象為下凸殼, 這裡給出概念圖.
備註: kbc
dkbcd
.我們需要截距b
b 最小進而使答案最優, 即找到乙個最優的決策點.找到
第一條斜
率大於k
的線段,
過左端點
的直線截
距即為最
小值.找
到第一條
斜率大於
k的線段
,過左端
點的直線
截距即為
最小值.
使用單調佇列維護, 沒學過的可以看 這裡 了解一下,
具體地說:
對上轉移方程, 應當維護斜率從隊首到隊尾的單調遞增佇列,
設當前是第 i
i 個點,
不斷彈出隊首, 直到隊首與次隊首的斜率大於等於k
k 或 佇列長度為 1
1 , 隊首即為當前最優的決策點.
不斷彈出隊尾, 直到隊尾與次隊尾的斜率小於次隊尾與 i
i 的斜率, 將第 i
i 個點從隊尾入隊(對後面來說新的決策) .
時間複雜度 o(n
)o(n
) .經典例題kk
不確定正負, 此時不能彈出隊首, 但是仍然可以維護單調性, 二分查詢來彌補, 時間複雜度 o(n
logn
)o(n
logn
) , 例題 , 下有數學解釋 .
決策點的橫座標不單調遞增, 需要在任意位置插入決策點, 待填坑
待填坑 .
以 該題 的式子為例, (已經去掉 min
min),f
[i]=
f[j]
+st[
i]∗(
sc[i
]−sc
[j])
+s∗(
sc[n
]−sc
[j])
f[i]
=f[j
]+st
[i]
∗(sc
[i]
−sc
[j])
+s∗(
sc[
n]−s
c[j
])設 決策 j
j 比 決策 k
k 優, 則f[
j]+s
t[i]
∗(sc
[i]−
sc[j
])+s
∗(sc
[n]−
sc[j
])k]+s
t[i]
∗(sc
[i]−
sc[k
])+s
∗(sc
[n]−
sc[k
])f[
j]+s
t[i
]∗(s
c[i
]−sc
[j]
)+s∗
(sc
[n]−
sc[j])
k]+s
t[i
]∗(s
c[i
]−sc
[k]
)+s∗
(sc
[n]−
sc[
k])化簡得f[
j]−f
[k]s
c[j]
−sc[
k]st[i
]sc
[j]−
sc[
k]f[
j]−f
[k]
st[
i].若 st[
i]st
[i]
單調遞增, 則 j
j 在以後不可能比 k
k 更優了, 所以可以執行彈出隊首的操作 .
否則 j
j 可能在以後的某乙個決策中比 k
k 更優, 不能直接彈出隊首 .
動態規劃 斜率優化
一 引用 一般dp 方程可以轉化成 dp i f j x i 的形式,其中 f j 中儲存了只與 j相關的量。這樣的 dp方程可以用單調佇列進行優化,從而使得 o n 2 的複雜度降到 o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j ...
動態規劃 單調斜率優化DP
acwing 1087.修剪草坪 旅行商問題 輸入樣例 641 351 23 輸出樣例 acwing 1087.修剪草坪 動態規劃 f i max f i 1 f i j 1 sum i j sum i f i 表示從前i個中選,且合法的方案數。令x i j,則有 f i min f i 1 f x...
演算法 動態規劃之斜率優化
斜率優化通常使用單調佇列輔助進行實現,用於優化 dp 的時間複雜度。使用單調佇列優化 dp 通常可以解決型如 dp i min f j g i 的狀態轉移方程。其中 f i 是只關於 i 的函式,g j 是只關於 j 的函式。樸素的解決方法是在第二層迴圈中列舉 j 來實現最小值,時間複雜度為 o n...