DP的優化總結


一、預備知識

  1. \(tD/eD\) 問題:狀態 t 維,決策 e 維。時間復雜度\(O(n^{e+t})\)

  2. 四邊形不等式:

    稱代價函數 w 滿足凸四邊形不等式,當:\(w(a,c)+w(b,d)\le w(b,c)+w(a,d),\ a < b < c < d\)
    如下所示,區間1、2對應的 w 之和 ≤ 3、4之和

\[\underbrace {\overbrace {a \to \underbrace{b \to c}_3}^1 \to d }_4 \llap{\overbrace {\phantom{b\to c\to d}}^2} \]

  1. 凸完全單調性:

稱矩陣 \(A\) 凸完全單調,當:
\(A(a,c)\ge A(b,c)\Rightarrow A(a,d)\ge A(b,d),\ a < b < c < d\)
如下所示,如果滿足1區間對應的 w 比2大,那么可以推出3比4大。

\[\overbrace {\overbrace {a \to b \to c}^1 \to d }^3 \llap{\underbrace {\underbrace{\phantom{b\to c}}_2\phantom{\to d}}_4} \]

由四邊形不等式可以推出完全單調性,反之不真。

  1. 區間包含關系單調:w 滿足\(w(b,c)\le w(a,d),a\le b\le c\le d\)
  2. 決策單調性:\(r_j\)是使得矩陣A 第 j 列最小的行號。若\(A\)滿足凸完全單調性可以推出\(r_1\le r_2 \le \cdots \le r_m\),即最小值行號遞增。

二、優化方法

1. 利用決策單調性

轉移方程:\(f(j)=\min_{i < j}\{f(i)+w(i,j)\}\)

\(A(i,j)=f(i)+w(i,j)\)表示狀態 j 從上一列的第 i 行轉移過來的結果。

w滿足凸四邊形不等式\(\Rightarrow\)w 是凸完全單調的\(\Rightarrow A\)也是凸完全單調的\(\Rightarrow\)決策單調。

令 d(j) 表示最小的滿足第 j 行比前面行優的列編號。

每個決策(行)的作用范圍是相互連接且遞增的列區間,d(j)就是j作用區間的起點,比如:

111224444,d(1)=1,d(2)=4,d(4)=6

由於決策單調,我們用棧維護\(< d(j),j>\)。每次要做的就是:

  • 二分找到d(j)在哪個列區間,彈出后面的區間。
  • 在這個列區間里二分計算出d(j)
  • 入棧

這樣就從\(O(n^2)\)優化到了\(O(n\log_2n)\)

2. 分治優化

轉移方程:\(f(i,j)=\min \{f(i-1,k-1)+w(k,j)\}\)

也是利用決策單調性。

令 d(i, j) 表示 f(i, j) 的最優決策。

\(d(i,j')\le d(i,j) ,j' < j\)

於是可以在d(i, j) 前面的區間遍歷尋找d(i', j')。

我們分治的過程 \(solve(opt_L,opt_R,l,r)\) 遍歷\(opt_L\)\(opt_R\) 計算出中點\(m=(l+r)/2\) 的 d(i, m)。

那么所有\(l\le x < m\) 的 d(i, x) 一定是在\([opt_L, d(i,m)]\)區間內,所有\(m < x\le r\)的d(i, x) 一定是在\([d(i,m),opt_R]\)區間內。
所以遞歸:

solve(optL,d[i][m],l,m-1);
solve(d[i][m],optR,m+1,r);

相關文章:post1

3. 單調隊列

轉移方程:\(\displaystyle f(i)=\min_{j=b[i]}^{i-1}\{g(j)\} + w(i)\)\(b[i]\)隨 i 遞增。
若后面的一個決策更優,那么前面的決策就可以刪掉。因此單調隊列維護決策表:

  • 隊首出隊,直到隊首符合范圍
  • 此時隊首就是最優決策
  • 計算出的 g(x)如果比隊尾優,不斷刪除隊尾,直到g(x)沒有更優,則插入隊尾。
  • \(O(n)\)

4. 斜率優化

轉移方程: \(f(i)=\min\{a_{i}\cdot x_{j} + b_{i} \cdot y_{j}\}\)

這是一種數形結合的思想。將每個決策作為一個點\((x_j,y_j)\),畫在平面直角坐標系中,於是我們要找的是讓\(z=a_{i}\cdot x+ b_{i} \cdot y\) 最小的點。變形得到\(y=-\frac {a_i}{b_i} \cdot x+\frac z {b_i}\)。也就是找一個點,斜率為\(-\frac {a_i} {b_i}\)的直線經過該點時,縱截距最小。

可以發現所有最優決策點在一個凸殼上。

  • 如果斜率和 x 都單調,只要用單調隊列維護,隊尾的刪除是因為要維護凸性,隊首的刪除是因為決策點在凸殼上是單調移動的,當前隊首不是最優解,之后也不會是最優解。\(O(n)\)
  • 否則,二分可以找到最優決策點。將凸殼上的點連邊,斜率是單調遞增的,決策 i 插入時,先根據 x 二分找到插入點,然后兩邊進行 Graham 維護凸性,就是刪點。x 不單調時需要用平衡樹動態維護凸包。\(O(n\log_2n)\)
  • 另外可以用 cdq分治 代替平衡樹來做。
  • 斜率優化的題一般也可以用分治優化做。

相關文章:
bzoj1492 [NOI2007]貨幣兌換Cash

5. 凸包優化(Convex Hull Trick)

轉移方程:\(f(i)=\min \{f(j)+b_j*a_i\}\)

其實相當於上式\(a_i=1,x_j=f(j),y_j=b_j,b_i=a_i\),因此也可以用斜率優化。

將每個決策\(A(i,j)=\color{blue}{b_j}*a_i+\color{green}{f(j)}\)

作為一條直線\(y=\color{blue} {m_j}*x+\color{green}{c_j}\),當前狀態選擇的決策就是將\(x=a_i\)帶入所有直線,得到最小值的那條直線。

我們用棧維護有效(最小值可能出現在它上面)的直線。

如果\(b_j\)遞減,那么相當於不斷加入一條斜率更小的直線,它和最后一條直線\(l_1\)的交點如果比\(l_1\)\(l_2\)的橫坐標要更小,則\(l_1\)無效了,從棧中彈出,反復執行直到橫坐標不更小或者只剩棧底,此時入棧。這個過程類似維護凸包。

如果\(a_i\)遞增,那么每次最小值一定在最后一條直線上。於是復雜度是\(O(n)\)

相關文章:Convex hull trick

6. 凸包優化2

轉移方程:\(f(i,j)=\min \{f(i-1,k)+b_k*a_j\}\)

i 固定時,每個決策\(A(j,k)=\color{blue}{b_k}*a_j+\color{green}{f(i-1,k)}\),作為一條直線\(y=\color{blue} {m_k}*x+\color{green}{c_k}\),那么接下來同上。
故總得復雜度是\(O(kn)\)

相關文章: post2

7. Knuth優化

轉移方程 \(f(i,j)=\min\{f(i,k-1)+f(k,j)\}+w(i,j)\)

  1. 如果 w 滿足四邊形不等式和 區間包含單調性,那么 f 也滿足四邊形不等式。
  2. 定義 f 取得最優值的決策:\(s(i, j)\),如果 f 滿足四邊形不等式,則 s 單調:\(s(i,j-1)\le s(i,j) \le s(i+1,j)\)

於是轉移方程改寫為:

\(f(i,j)=\min\{ f(i,k-1)+f(k,j)\}+w(i,j), s(i,j-1)\le k\le s(i+1,j)\)

由於這個狀態轉移方程枚舉的是區間長度L,假設求f(i,i+L),而每次循環長度之和為

\[\begin{aligned} &\sum_{i=1}^{n-L}{s(i+1,i+L)-s(i,i+L-1)}\\ &=s(2,L+1)-s(1,L)+s(3,L+2)-s(2,L+1)+s(4,L+3)-s(3,L+2)..\\ &=s(n-L+1,n)-s(1,L)\le n-1 \end{aligned} \]

枚舉L是的\(O(n)\),於是總的復雜度是\(O(n^2)\)

Donald E. Knuth 從最優二叉搜索樹的數據結構中提出的。

相關文章:1 2

三、題目

凸包優化(CHT)

  1. BZOJ 1701-Cow School Solution-Video
  2. SPOJ-APIO2010 Commando
  3. SPOJ-TRAKA
  4. SPOJ-BAABO
  5. SPOJ-ACQUIRE
  6. SPOJ-NKLEAVES
  7. cf91e-SkyScrapers (+Data Structures)
  8. cf311b Cats Transport
  9. cf660f Bear and Bowling 4
  10. cf319c Kalila and Dimna in the Logging Industry
  11. cf631e Product Sum
  12. cf455e Function
  13. cf536c Tavas and Pashmaks
  14. cf377e Cookie Clicker
  15. cf91e Igloo Skyscraper
  16. Jump mission | CodeChef
  17. Contest Page | CodeChef

Knuth 優化

  1. Spoj-BRKSTRNG
  2. UVa10003-Cutting Sticks
  3. UVa10304
  4. Order-Preserving Codes - gym100212C
  5. UVa12057
  6. UVa-12836

分治優化

  1. cf321e Ciel and Gondolas
  2. hr-Guardians of the Lunatics
  3. Chef and Bitwise OR Operation | CodeChef
  4. SPOJ-NKLEAVES
  5. hr-mining
  6. Bicolored Horses
  7. UVa12524
  8. cf673e Levels and Regions
  9. ARC 067D

斜率優化

  1. BZOJ 1597 [Usaco2008 Mar]土地購買
  2. BZOJ 3675 [APIO 2014]序列分割
  3. BZOJ 1010 [HNOI2008]玩具裝箱toy
  4. BZOJ 3437 小P的牧場
  5. BZOJ 3156 防御准備
  6. BZOJ 1096 [ZJOI2007]倉庫建設
  7. BZOJ 1911 APIO 2010 Commando
  8. BZOJ 4518 [SDOI2016] 征途
  9. HDU 3507
  10. HDU 3401
  11. HDU 2191
  12. HDU 5956 The Elder

平衡樹維護動態凸包

  1. cf70d
  2. BZOJ 2300(HAOI2011)防線修建
  3. BZOJ 1492 貨幣兌換Cash
  4. HDU 5127 Dogs’ Candies

參考文章:

  1. Dynamic programming with convexity, concavity and sparsity
  2. 《算法藝術與信息學競賽》p149。
  3. 1D1D動態規划優化初步
  4. 動態規划算法的優化技巧-毛子青
  5. dp優化-個人對dp優化的理解
  6. Dynamic Programming Optimizations
  7. 斜率優化 二


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM