單調性優化辣麼多。。不急。。乙個個來,先斜率優化
\ \ \ \ \ \ \ \ 斜率優化是用來對一類具有決策單調性的動態規劃轉移方程進行決策優化的方法,主要是通過決策單調性構造出斜率形式,並通過代數方法/幾何方法發掘其特徵並使用適當的資料結構維護決策。
\ \ \ \ \ \ \ \ 形如\(dp[i]\ =\ min/max\\)的狀態轉移方程,可以考慮使用斜率優化。
\ \ \ \ \ \ \ \ 這裡採用直接化式子的方法。還有一種是假設i處決策點j比決策點k更優,得到斜率式子,看斜率的單調性如何,x座標(分母上的被減數或減數)增減性如何,跟直接法類似。這裡只介紹直接法。
\ \ \ \ \ \ \ \ 先將dp方程化為\(dp[i]\ =\ min/max\\),變形後可得\(y[j]\ =\ -\frac\ +\ \frac\),把決策j看作是二維平面上的點,上述式子等價於直線方程y = kx + b,可以看到k一定,我們的目標是最大/最小化b。是不是很像線性規劃?我們把(x[j],y[j])看做很多點,用斜率為$-\frac$的直線上下移動,第乙個碰到的點使得截距最大/小,實際上就是線性規劃找最大/最小值的思路!我們會發現所有最優決策點會形成乙個上/下凸殼。接下來的問題就是維護這個上/下凸殼
情況1:決策橫座標x[j]和斜率k單調
\ \ \ \ \ \ \ \ 這意味著我們可以使用單調佇列維護。我們這裡只考慮k和x[j]都單調遞增的情況。我們想象一條直線在一堆點外漸漸往上靠,靠到乙個點後斜率增加繼續靠.....靠到的這些點形成了乙個下凸殼。我們把這些點按照x順序從小到大排,由於隨著斜率增加,碰到的點的橫座標也隨之增加,因此碰到點的順序就是按x從小到大排的這些點的順序。可是有一些點並不在下凸殼中,該怎麼排除這些點呢?設s(i,j)表示點i與點j的斜率,如果有s(i,j) > s(j,k)且i < j < k,那麼點j就不會被直線靠到。也就是說,點j不是下凸殼上的點。如此,使用單調佇列維護決策點即可。隊尾元素相當於j,隊尾前乙個元素相當於i,當前元素相當於k。
情況2:決策橫座標x[j]單調,斜率k不單調
\ \ \ \ \ \ \ \ 仍舊可以使用單調佇列維護上/下凸殼,根據x[j]單調性,在單調佇列上二分相鄰兩點,根據斜率判斷區間怎麼移動即可。
情況3:決策橫座標[j]與斜率k均不單調
\ \ \ \ \ \ \ \ \ 這意味著不能再用單調佇列維護了,我們需要用乙個更加高階的資料結構來動態維護下凸殼——平衡樹。我們用平衡樹維護乙個下凸殼,根據x大小建樹,每個節點還要存他跟相鄰節點的斜率。插入的時候,先根據他的前驅後繼與插入點的斜率關係(見前文)來看他是否能加入凸殼,能的話左右不斷刪點即可。查詢轉移點的時候,直接沿著splay找即可。什麼二分什麼的都不用。還可以用cdq分治,即把狀態區間[l,r]分成[l,mid],[mid+1,r]遞迴求解,然後對[l,mid]遞迴求解,可以得到其所有的dp,然後考慮用[l,mid]更新[mid+1,r],對[l,mid]按x排序,可以按照上面的斜率思想線性構造凸殼,然後把[mid+1,r]按斜率排序,尺取法即可線性用[l,mid]去更新[mid+1,r],總複雜度o(nlog^2n)。
待填坑待填坑
決策單調性優化DP學習筆記
廢話,當然是在dp式子滿足某些性質的時候來優化複雜度 對於 j 往大於 j 的 i 轉移,可以表示成乙個關於 i 的函式 f j i 也就是 dp i max min 若是取 max 並且在某乙個地方 f j i 從下面跑到了 f k i 的上面 如果加入 f j i 這個函式時本來就在 f k i...
決策單調性優化DP 分治優化決策單調性
前言 本來這篇已經寫了 frac 了 然後我關機時忘儲存了。華麗的分割線 對於類似於 dp i j max min dp k 1 j 1 count k,i 不妨設 當 最後一次 max min 更新時 f i,j k 若有 forall i,j in 1,n s.t.i j rightarrow ...
單調佇列優化和決策單調性優化
有時狀態轉移方程形如f i j min w i,j 其中l i,j k j,l i,j l i,j 1 如果兩個決策k1,k2滿足f i 1 k1 f i 1 k2 且k1 k2,那麼k1出現後k2就沒用了。維護乙個佇列,按k從小到大存下所有有用的決策,f i 1 k 是單調上公升的。每次加入新決策...