1. 程式人生 > >常見的DP優化類型

常見的DP優化類型

ces force 要求 答案 第一個 時間 四邊形不等式 img set

常見的DP優化類型

1單調隊列直接優化

技術分享

如果a[i]單調增的話,顯然可以用減單調隊列直接存f[j]進行優化。

2斜率不等式

技術分享

即實現轉移方程中的i,j分離。b單調減,a單調增(可選)。

令:

技術分享

在隊首,如果g[j,k]>=-a[i],那麽j優於k,而且以後j也優於k,因此k可以重隊列中直接刪去。在隊尾,如果x<y<z,且g[x,y]<=g[y,z],也就是說只要y優於x一定可以得出z優於y的,我們就刪去y。

經過隊尾的篩選,我們在隊列中得到的是一個斜率遞減的下凸包,每次尋找從上往下被-a[i]斜率的線所掃到的第一個點,a[i]單調的話通過隊首的維護我們可以在均攤O(1)的時間內找到這個點。值得註意的是,即使a[i]不單調,我們仍然可以通過二分在O(log n)的時間內找到轉移點。

高維的場合和低維並沒有區別。只要使用斜率和單調隊列優化,一定可以降一維。高維時可以沒有j<i的限制,這時我們理解成若幹條b[j]*x+f[j]的直線形成一個下凸包求值器,然後帶入一個a[i]作為x計算得的結果就是答案,時間是O(nlogn)。

3下凸包求值器(CF-455E)

這是一種很奇怪的情況。有些時候,問題可以轉化成給定一堆直線K[i]*X+B[i],每次詢問選擇連續的一段[a..b]和一個x,求最小值。

做法是構造一個下凸包求值器,實現對給定x求值和合並兩個功能,內部實現是按K排好序的線段序列。然後線段樹每個節點維護一個求值器。這樣可以在O(nlognlogn)的時間內解決問題。

4分治優化

技術分享

元素的分組合並問題通常擁有以上的形式。優化的條件是A[i,j]的單調性,也就是說A[i,j]<=A[i,j+1]。也即要求C[k,j]滿足四邊形不等式C[a,c]+C[b,d]<=C[a,d]+C[b,c] 。(含義是:越晚並入新元素,並入的組尺寸越小,其額外代價越小。這裏四邊形不等式已經是充分條件了,不需要區間單調)

優化的偽代碼如下:

compute(i,l,r,ol,or)

1. 令m=(l+r)>>1

2. 尋找k=ol..or,使得dp[i,m]=dp[i-1,k]+C[k,m]最小

3. 如果l==r,返回。否則執行compute(i,l,m-1,ol,k);compute(i,m+1,r,k,or);

5四邊形不等式

四邊形不等式優化應用於區間DP:

技術分享

要求C[i,j]滿足四邊形不等式C[a,c]+C[b,d]<=C[a,d]+C[b,c]和區間單調性C[b,c]<=C[a,d]。註意這裏的C不在轉移方程的內部,而是一個定值。

滿足上件的前提下,有A[i,j-1]<=A[i,j]<=A[i+1,j](關鍵條件),因此可以優化。優化方法為以|i-j|的遞增順序DP,同時記錄各個A[i,j]值,枚舉時在A[i,j-1]和A[i+1,j]的區間卡內枚舉。

6矩陣優化

一眼能看出來就是快速冪。多為期望或概率DP。

7線段樹優化

通常是有不確定的強制轉移的場合。如FAFU1231。

技術分享

此時因A[i],B[i]欠缺單調性,單調隊列的使用受到限制,用線段樹即可解決。如斜率優化中摻雜此種限制,則同上3.

常見的DP優化類型