單調佇列優化和決策單調性優化

2022-06-01 19:12:12 字數 1158 閱讀 7680

有時狀態轉移方程形如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 決策單調性在層之間轉移,可以分治 或者利用...