\(}\)
事實上斜率優化是專門用來處理這樣一類\(dp\)式子的
\[dpi=ai+maxj=1i−1(bj−cj×basei)
\]窩萌嘗試把上式中的\(bj\)、\(cj\)和\(basei\)等價成\(xj\)、\(yj\)和\(ki\),並把它們丟到乙個平面上,然後它萌就會變成一堆點\((xj,yj)\),畫一條過他們的直線,類似於
\[y−yj=ki(x−xj)
\]變換一下
\[y=kix+(yj+xj)
\]窩萌會發現,現在窩萌所求的不過是一條截距最大的直線而已。那麼其實就是相當於求乙個給定\(k\)意義下最靠上的點。
\(qwq\)那麼窩萌不妨先減弱問題的不可做性,使其單調——令\(x\)單調增、\(ki\)單調減。
那當窩萌在樸素\(dp\)遍歷所有的\(ki\)時,所得到的直線的軌跡應該是這樣的:
(上圖是個\(gif\)……不動的話就拖出來看吧)軌跡正好是乙個凸殼,並且你會發現它的軌跡正好是再繞著每個斜率下最優的點旋轉。
有個神犇對此是這麼解釋的:
可以發現好多點是沒有機會作為最優的點的。
形象⼀點的說,如果⼀個點的左邊和右邊某兩個點在它上⽅「搭起」了⼀條線段,那麼它就永遠不會被選到。
而因為我們保證了\(x\)和\(k\)的單調性,所以就我們可以比較方便的考慮「如何選取當前最優點」這個問題。我們考慮遇到乙個新的點,是否把他加入最優解集合裡面,其實質就是維護乙個上凸殼。那麼已知兩個點\(a\)和\(b\),現在遇到了新加入的點\(c\),此時有兩種情況:
1、\(bc\)的斜率大於\(ab\)的斜率
這時我們需要拋棄\(b\),直接連線\(ac\):
2、\(bc\)的斜率小於\(ab\)的斜率
通過這種方式我們就可以完成對整個凸殼的維護。而在判定時也很簡單,用叉積來判斷即可,即有\(a\)、\(b\)、\(c\)三個點分別是\((xa,ya),(xb,yb),(xc,yc)\)滿足\(xa≤xb≤xc\),那麼如果
\[(xc−xa)(yb−ya)−(xb−xa)(yc−ya)<0
\]則證明是第一種情況,否則是第二種。
\(emmmm\)直接求斜率當然也是可以的吧,不過會不會很慢很麻煩啊
\(qwq\)。
\(}\)
\(emmm\)我們考慮用乙個邏輯上單調的佇列來實現去掉不優的狀態 +加入新的狀態。回歸上題,我們所求的是\(max\),所以我們需要去掉那些斜率小的狀態;同時需要加入斜率大的狀態。由於整個過程牽扯到前後刪點,所以用雙端佇列來維護。本蒟蒻的(偽)**如下:
int queue[maxn] ;
int head = 0, tail = 0 ;
for(i = 1; i <= n; i ++)
dp[i] = base[i] + y[a] - k[i] * x[a] ;
maybe y[i] needs calcing ?
maybe x[i] also needs calcint ?
so, calc_it() ;
while (tail - head >= 2)
queue[++ tail] = i ;
}
對了……我在啃這個地方時出了個\(bug\)……那是因為我一直以為\(y\)和\(x\)從本質上來講有\(n^2\)個……\(orz\)
那麼對於拓展而言,我們以上做的一切都是基於「\(x\)和\(k\)單調」這一前提的,那麼還會有以下兩種情況:
1、\(x\)不單調
那麼實質上就是我們需要動態插入刪除、從內部刪除,那麼就需要用平衡樹來維護乙個凸包了 。
2、\(k\)不單調
那麼實質上就是我們原來比較方便的第乙個\(while\)——從左往右直接刪是不行的了,因為現在不優不代表之後不優,所以此時我們需要的就是三分乙個位置而不是從前向後掃、
哦,還有,對於\(dp\)式子而言,如果它長這個樣子:
\[dpi=ai+minj=1i−1(bj−cj×basei)
\]那麼其實我們維護的就是乙個下凸殼,所以此時只需要把所有的大於號改成小於號即可。
斜率優化學習筆記
目錄第二類斜率優化 注意事項 q a 例題 hnoi玩具裝箱 由題意我們可以馬上得到dp方程 dp i displaystyle min sum x 為字首和 很可惜,這個解法是 o n 2 的,無法ac 但是可以在當年騙很多分?接下來的文章中我們會用幾個簡稱 f i sum i i c 1 l 優...
斜率優化 學習筆記
前言 寒假yousiki講過斜率優化,但完全沒有聽懂。現在文化課解析幾何也學了不少,終於能做一些題了。有時候我們列出dp方程會得到形如這樣的式子 f i max min w i 1 leq j我們變換一下形式 2 a i b j f i a i 2 w i f j b j 2 仔細一看,上面的等式可...
斜率優化學習筆記
斜率優化是 dp 的一種有力優化方式。常用於處理當 dp 方程 f i max f j val i,j 中 val i,j 出現同時關於 i j 的項,而無法直接單調佇列優化的情況。考慮這麼乙個問題 顯然的 dp 問題。令 f i 為以 i 為某一段的結尾,前面總得分的最大值。顯然我們有狀態轉移方程...