學習筆記 斜率優化

2022-05-02 05:06:08 字數 1274 閱讀 1357

太久沒碰過這個玩意了,於是它就變成學習筆記了。

一般來說,斜率優化的dp會比其它的dp得到轉移方程要簡單一點點。

通式大概是:

\[f[i] = a(i)b(j) + c(i) + d(j)

\]也就是說,這種dp和單調佇列不同的一點是有同時和\(i,j\)有關的項,這時候就需要用到斜率優化。

拿道題目來講可能效果更好一些。

設字首和為\(s(i)\),那麼很快得到dp方程:

\[f[i] = \min_\

\]設\(a(i) = s(i) + i, b(i) = a(i) + l + 1\)。

於是\[\beginf[i] &= f[j] + (a(i) - b(j))^2 \\&= f[j] + a(i)^2 - 2a(i)b(j) + b(j)^2\end

\]移項可得

\[2 a(i)b(j) + f[i] - a(i)^2 = f[j] + b(j)^2

\]令\(b(j) = x, f[j]+b(j)^2 = y\),那麼這個方程就可以看成一條平面直角座標系上的一條直線。

此時\(f[i]\)的含義變為,當這條直線經過點\(p(x, y)\)時,與\(y\)軸的截距加\(a(i)^2\)的值(\(a(i)^2\)是乙個定值)。

於是我們只需要找到這個斜率的最小值。

我們可以畫乙個圖輔助理解。(圖源oi-wiki,侵刪)

那麼我們可以用乙個單調佇列維護下凸包就可以了。

由於在這道題中,斜率是單調遞增的,所以我們可以將隊頭斜率小於當前斜率的點全部彈掉,取隊頭為轉移點即可。

首先需要知道乙個性質:每一段左右兩端的貝殼大小相同,而且這一段的\(s_0\)即為左右兩端貝殼的大小。

那麼考慮dp,設\(f[i]\)表示前\(i\)個數能夠獲得的最多檸檬數,\(c_i\)表示這種大小第幾次出現。

那麼有\[f[i] = \max_\

\]把所有項拆開有:

\[f[i] = f[j - 1] + s_ic_i^2 - 2s_ic_ic_j+s_ic_j^2+2s_ic_i-2s_ic_j+s_i

\]移項可得:

\[f[j - 1] - 2s_ic_j + s_ic_j^2 = f[i] - 2s_ic_i - s_ic_i^2 + s_i + 2s_ic_ic_j

\]令\(c_j = x, \ \ f[j - 1] - 2s_ic_j + s_ic_j^2 = y\),就可以像上一道題那樣寫出一條直線來。

於是我們對每種顏色用單調棧維護上凸包,由於斜率單調遞增,所以我們可以將隊尾斜率小於當前斜率的點全部彈掉,同時取隊尾為轉移點即可。

學習筆記 斜率優化

斜率優化入門題 設 f x 為 f x 的後綴和,t x 為 t x 的字首和。dp i 表示完成到第 i 任務的最小代價,轉移 dp i min 拆掉 我們發現只和 j 相關的可以直接預處理,現在的問題是確定了 i 如何快速找到乙個 j 令 y j dp j f j 1 times s t j x...

學習筆記 斜率優化

感謝cxl的部落格,講得很清楚 斜率優化的特點在於可以在權值 w i,j 中可以找到一項 f i times g j 的項,其中 j 是決策點,這時我們不能用單獨的單調佇列來優化因為這裡沒有單調性。決策單調性的定義 對於形如 f i min f j w j,i 的狀態轉移方程,記 p i 為 f i...

斜率優化學習筆記

目錄第二類斜率優化 注意事項 q a 例題 hnoi玩具裝箱 由題意我們可以馬上得到dp方程 dp i displaystyle min sum x 為字首和 很可惜,這個解法是 o n 2 的,無法ac 但是可以在當年騙很多分?接下來的文章中我們會用幾個簡稱 f i sum i i c 1 l 優...