斜率优化
很久之前一直覺(jué)得斜優(yōu)很難理解,,,今天再看發(fā)現(xiàn)好像是挺好理解的。
不過(guò)如果x不單調(diào)就要用splay或者cdq維護(hù)了,,,,依舊很惡心。、
先講最基礎(chǔ)的斜優(yōu)吧,不單調(diào)的以后再填坑。
先來(lái)看一道例題:CF311B Cats Transport 斜率優(yōu)化DP
當(dāng)我們得到DP方程$f[i][j] = f[i - 1][k] + (j - k) t_{j} - (s[j] - s[k])$之后,我們對(duì)式子進(jìn)行轉(zhuǎn)化,
將只跟k相關(guān)的放在式子左邊,把剩余部分放在式子右邊,同時(shí)在式子右邊把只跟k相關(guān)的放在一起,把既跟j有關(guān)又跟k有關(guān)放在一起。
$$f[i][j] = f[i - 1][k] + (j - k) t_{j} - (s[j] - s[k])$$
$$\Rightarrow f[i][j] = f[i - 1][k] + jt_{j} - kt_{j} - s[j] + s[k]$$
$$\Rightarrow -s[k] - f[i - 1][k] = -kt_{j} + jt_{j} - s[j] - f[i][j]$$
$$\Rightarrow s[k] + f[i - 1][k] = t_{j}k - jt_{j} + s[j] + f[i][j]$$
我們可以假設(shè)$y = s[k] + f[i - 1][k], x = k, K = t_{j}, b = -jt_{j} + s[j] + f[i][j]$。
那么這就是一個(gè)$y = kx+b$的形式的式子。
我們可以把所有的決策點(diǎn)都看作一個(gè)二維平面上的點(diǎn)(x, y),因?yàn)槲覀冎恍枰?x, y)就可以知道這個(gè)點(diǎn)對(duì)當(dāng)前決策的所有貢獻(xiàn)。
而跟當(dāng)前狀態(tài)有關(guān)的只有k和b。觀察到我們要求f[i][j]最小,就是要求b最小(因?yàn)閎的其他部分是固定的)。
而k是固定的,于是我們可以看做一個(gè)二維平面上有很多點(diǎn),我們要用一根斜率為k的直線(xiàn)覆蓋某個(gè)點(diǎn),使得b最小。
顯然這個(gè)使得b最小的點(diǎn)會(huì)出現(xiàn)在所有點(diǎn)的下凸包上,于是我們考慮維護(hù)一個(gè)下凸包,然后每次在這個(gè)凸包上尋找最優(yōu)決策點(diǎn)。
相當(dāng)于用一條斜率為K的直線(xiàn)靠近這個(gè)凸包,第一個(gè)碰到的點(diǎn)就是最優(yōu)決策點(diǎn)。
因?yàn)镵是遞增的,所以在下凸包上第一個(gè)被碰到的點(diǎn)是單調(diào)遞增的,又因?yàn)閤遞增,所以可以直接用單調(diào)隊(duì)列維護(hù)。
感覺(jué)講得有點(diǎn)亂,,,NOIP之后再來(lái)完善吧
emmm。。。好像咕了,,,不想寫(xiě)了,,,懶得畫(huà)圖
轉(zhuǎn)載于:https://www.cnblogs.com/ww3113306/p/9936451.html
總結(jié)
- 上一篇: 第二本书第九课
- 下一篇: 2018.11.09 codeforce