太久沒碰過這個玩意了,於是它就變成學習筆記了。
一般來說,斜率優化的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 優...