斜率优化
很久之前一直覺得斜優很難理解,,,今天再看發現好像是挺好理解的。
不過如果x不單調就要用splay或者cdq維護了,,,,依舊很惡心。、
先講最基礎的斜優吧,不單調的以后再填坑。
先來看一道例題:CF311B Cats Transport 斜率優化DP
當我們得到DP方程$f[i][j] = f[i - 1][k] + (j - k) t_{j} - (s[j] - s[k])$之后,我們對式子進行轉化,
將只跟k相關的放在式子左邊,把剩余部分放在式子右邊,同時在式子右邊把只跟k相關的放在一起,把既跟j有關又跟k有關放在一起。
$$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]$$
我們可以假設$y = s[k] + f[i - 1][k], x = k, K = t_{j}, b = -jt_{j} + s[j] + f[i][j]$。
那么這就是一個$y = kx+b$的形式的式子。
我們可以把所有的決策點都看作一個二維平面上的點(x, y),因為我們只需要有(x, y)就可以知道這個點對當前決策的所有貢獻。
而跟當前狀態有關的只有k和b。觀察到我們要求f[i][j]最小,就是要求b最小(因為b的其他部分是固定的)。
而k是固定的,于是我們可以看做一個二維平面上有很多點,我們要用一根斜率為k的直線覆蓋某個點,使得b最小。
顯然這個使得b最小的點會出現在所有點的下凸包上,于是我們考慮維護一個下凸包,然后每次在這個凸包上尋找最優決策點。
相當于用一條斜率為K的直線靠近這個凸包,第一個碰到的點就是最優決策點。
因為K是遞增的,所以在下凸包上第一個被碰到的點是單調遞增的,又因為x遞增,所以可以直接用單調隊列維護。
感覺講得有點亂,,,NOIP之后再來完善吧
emmm。。。好像咕了,,,不想寫了,,,懶得畫圖
轉載于:https://www.cnblogs.com/ww3113306/p/9936451.html
總結
- 上一篇: 第二本书第九课
- 下一篇: Python学习 Day 046 - D