在寫斜率優化之前,我們來回顧一下單調佇列優化的dp
1. 對於如下形式的dp方程 dp
[i]=
min(
0<
j我們直接用乙個變數維護(0, i)中dp[j] + f(j)的最小值即可
2.對於如下形式的dp方程 dp
[i]=
min(
i−m<
j我們可以用乙個單調佇列維護乙個(i - m, j)中dp[j] + f(j)的最小值,然後做到o(1)轉移。
但是對於形如 dp
[i]=
min
的方程,無法做到o(1)計算dp
[j]+
f(i,
j)的最小值,這時就需要斜率優化這個技巧來解決這個問題了。
令k < j < i,當我們更新dp[i]時,如果有dp[j] + f(i, j) 比dp[k] + f(i, k)更優,則有dp[j] + f(i, j) - (dp[k] + f(i, k) < 0,對於這個不等式如果能夠化解成如下形式 y(
j)−y
(k)x
(j)−
x(k)
i)我們就能通過斜率優化這個dp了。
讓我們來舉乙個例子:
hdu3507 dp方程為 dp
[i]=
min
令k < j < i,當有 dp
[j]+
m+(s
um[i
]−su
m[j]
)2−(
dp[k
]+m+
(sum
[i]−
sum[
k])2
)<0
從j轉移到i, 比從k轉移到i更優,變換此不等式可得: (d
p[j]
+sum
[j]2
)−(d
p[k]
+sum
[k]2
)sum
[j]−
sum[
k]<2s
um[i
] 令y
(i)=
dp[i
]+su
m[i]
2 , x(
i)=s
um[i
] , f(
i)=2
sum[
i]則將此不等式化解為上述形式。
可以發現,若滿足y(
j)−y
(k)x
(i)−
x(j)
i)則j轉移到i,比k轉移到i更優,如果我們把(x(j), y(j)), (x(k), y(k))當成平面上的兩個點pj, pk,這個不等式的含義即為若pj
pk−→
−−的斜率<f(i)則,從j轉移更優。
令grad(i, j)表示pi
pj−→
−−的斜率,現在我們假設grad(i,j) < grad(j, k),若grad(i, j) < f(i),則i比j更優,若grad(i, j) > f(i), 則grad(j, k) > f(i),那麼從k轉移比從j轉移更優,當grad(i, j) < grad(j, k)的時候,無論如何j轉移到i都不會是最優。而這種情況恰好對應下圖
所以這種情況時,我們可以直接把j點刪除,最後能夠轉移的點集只會存在這種圖形,
所以最後我們維護乙個上凸集即可。
但是此時我們還是沒有解決最終問題,如何才能找到轉移到i點的最優的點呢。可以發現最後的點集一定是乙個凸集,也就是斜率單調!!這樣對於k < j, grad(j,k) < f(i),時更優,從圖形特點我們可以發現如果j比k優,那麼j點比所有比k小的點都優,所以對於每乙個f(i),我們維護乙個所有比i點小的凸集,二分查詢斜率比f(i)小的編號最大的點,就是最優的轉移點。如果f(i)也滿足單調性,比如這道題,我們還可以直接維護乙個單調佇列就能解決這個問題。
對於f(i)單調的這種情況,除了使用單調佇列優化的斜率優化做,我們還有另外一種分治的做法,但是複雜度會變成o(nlogn) 比o(n)差。
當f(i)單調的時候,我們可以發現若a > b,則f(a) > f(b),設轉移到a的最優點是c,轉移到b的最優點是d,一定有c > d。也就是轉移到a的最優點一定大於等於轉移到b的最優點。考慮這樣的分治
void dfs(int l, int r, int dl, int dr)
}dp[mid] = g; //更新dp[mid]的值
//因為上文敘述的單調性,
//更新[l,mid-1]的最優點,一定在[dl,dm]範圍內
if(l < mid) dfs(l, mid - 1, dl, dm);
//更新[mid+1,r]的最優點,一定在[dm,dr]範圍內
if(mid < r) dfs(mid + 1, r, dm, dr);
//此份**dfs順序有點問題,並不正確,但是並不影響理解
}可以發現這個分治比起斜率優化,不僅寫起來方便很多,並且適用的範圍也更廣。這個做法不侷限於斜率單調,可以發現只要滿足c是更新f(a)的最優點,d是更新f(b)的最優點,若a > b 一定有 c > d,則可以有這個分治做。
這個做法是我在codeforces 674e,跟claris神犇的**學會的solution,在此特地感謝claris.這個做法著實是非常的勁啊!多乙個log,但是換來編碼複雜度和通用性更廣的解法。
斜率優化dp小結
最近刷了幾道斜率優化dp算是對斜率優化有了一定的了解了 現在來小結一下 斜率優化dp的優化能力是將n 2優化成n,n 3優化成n 2 其轉移方程一般是dp k min dp i cost i 1 k 斜率優化優化的是排除一些不可能是最優解的解,那麼什麼情況下不可能是最優解呢 下面看一道題hdu 28...
斜率優化dp小結
先推薦一篇部落格 下文有小部分修改自 有些dp方程可以轉化成dp i f i,j x i 的形式,其中f j 與i和j有關。這樣的dp方程無法直接使用單調佇列進行優化,所以考慮另外一中降低複雜度的方式 斜率優化!舉個例題 hdu 3507 設dp i 表示到i的最少花費,sum i 表示從a 1 到...
斜率優化dp小結
在寫斜率優化之前,我們來回顧一下單調佇列優化的dp 1.對於如下形式的dp方程 dp i min 0 我們直接用乙個變數維護 0,i 中dp j f j 的最小值即可 2.對於如下形式的dp方程 dp i min i m 我們可以用乙個單調佇列維護乙個 i m,j 中dp j f j 的最小值,然後...