有時狀態轉移方程形如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]是單調上公升的。 每次加入新決策時,從佇列末尾刪去沒用的決策。 當佇列開頭決策的k首先對於所有的疑似決策單調性優化的題,最好是用打表來證明(隨便搞個大樣例或者後頭對拍一下.....一般嚴謹證明不太現實,當然也可以)這個在打o(n^2+)暴力時順便記錄一下gi就行了(這裡gi指是從gi轉移到i的)[最好考試都要先打好暴力,然後對著暴力來想a,分析性質]
這裡主要介紹兩種實現:
首先是講稿上的一些說法:
有時狀態轉移方程形如f[i]=min,其中j接下來補充一點自己理解的具體實現:
首先,對於所以的gi可以先標記為1(0)[視題目而定]預設為全都為從1轉移過來的,這裡用乙個結構體的棧來維護每個單調決策的適用範圍。
然後,我們依次考慮往後的單調決策更新,那麼對於每個i我們先通過二分已經維護的單調決策的適用範圍可以算出f[i](用線段樹啥的來刷一遍gi有點太傻了a....)同時由此我們可以得出複雜度為o(nlogn)(因為二分嘛)。
現在我們得到了新的f[i],所以用它來更新以後的,由於單調性,我們可以從後往前掃瞄棧,這裡有兩種情況:(1
)'>(1)
如果這個老決策的作用區間的起始位置(即l)仍然不如新決策優,那麼我們彈出老決策,將老決策的作用區間整個合併到新決策中,繼續往前掃 ;(2
)'>(2)
如果不滿足前面的條件,在老決策的作用區間中二分出新決策起作用的起始位置,將老決策分割,新決策入棧,結束掃瞄過程
;這裡每個決策裡的二分就是對於當前的m判斷f[i]+w[i,m]和f[j]+w[j,m]誰更優,若更優則i的起始範圍往前移,否則往後移;
感覺這個二分實現還挺好想的a....(霧)而且適用範圍貌似要比分治實現更廣一些(聽分治實現的時候一臉懵a...)
在這裡推薦一道例題(實打**才有效)
bzoj4709: [jsoi2011]檸檬
以及**(咕咕咕):
首先依舊是講稿上的一些說法:
有時狀態轉移方程形如f[s][i]=min,其中j接下來依舊是補充一點自己理解的具體實現:
(咕咕咕)
決策單調性優化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 ...
決策單調性優化,玄學 「for me「
例子 ans i max a j sqrt i j j i 大致意思 i位置的答案等於從i前面選乙個j位置,使得表示式最大。那麼,當咱們已經求出 i 的最大值就是在 j 位置的時候,求比 i 大的位置的答案的時候它的範圍應該是怎樣的呢?假設 a j sqrt i j a k sqrt i k j k...
決策單調性優化 dp 合集
p1912 noi2009 詩人小g 後面的決策能反超前面的,二分決策佇列。p3515 poi2011 lightning conductor 不是決策單調性,但可以維護決策的棧。後面的決策可能被前面的反超。cf321e ciel and gondolas 決策單調性在層之間轉移,可以分治 或者利用...