斜率優化dp小結

2021-07-11 17:43:41 字數 2776 閱讀 6974

在寫斜率優化之前,我們來回顧一下單調佇列優化的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 的最小值,然後...