斜率優化dp小結

2021-08-22 08:38:10 字數 1054 閱讀 2441

在寫斜率優化之前,我們來回顧一下單調佇列優化的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)的最小值,然後做到o(1)轉移。

但是對於形如 

dp[i]=mindp[i]=min

的方程,無法做到o(1)計算dp[j]+f(i,j)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)

我們就能通過斜率優化這個dp了。 

讓我們來舉乙個例子: hdu3507 dp方程為 

dp[i]=min

}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 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 的最小值,...

斜率優化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 到...