一、預備知識
-
\(tD/eD\) 問題:狀態 t 維,決策 e 維。時間復雜度\(O(n^{e+t})\)。
-
四邊形不等式:
稱代價函數 w 滿足凸四邊形不等式,當:\(w(a,c)+w(b,d)\le w(b,c)+w(a,d),\ a < b < c < d\)
如下所示,區間1、2對應的 w 之和 ≤ 3、4之和
- 凸完全單調性:
稱矩陣 \(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大。
由四邊形不等式可以推出完全單調性,反之不真。
- 區間包含關系單調:w 滿足\(w(b,c)\le w(a,d),a\le b\le c\le d\)。
- 決策單調性:\(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)\)
- 如果 w 滿足四邊形不等式和 區間包含單調性,那么 f 也滿足四邊形不等式。
- 定義 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),而每次循環長度之和為
枚舉L是的\(O(n)\),於是總的復雜度是\(O(n^2)\)。
Donald E. Knuth 從最優二叉搜索樹的數據結構中提出的。
三、題目
凸包優化(CHT)
- BZOJ 1701-Cow School Solution-Video
- SPOJ-APIO2010 Commando
- SPOJ-TRAKA
- SPOJ-BAABO
- SPOJ-ACQUIRE
- SPOJ-NKLEAVES
- cf91e-SkyScrapers (+Data Structures)
- cf311b Cats Transport
- cf660f Bear and Bowling 4
- cf319c Kalila and Dimna in the Logging Industry
- cf631e Product Sum
- cf455e Function
- cf536c Tavas and Pashmaks
- cf377e Cookie Clicker
- cf91e Igloo Skyscraper
- Jump mission | CodeChef
- Contest Page | CodeChef
Knuth 優化
- Spoj-BRKSTRNG
- UVa10003-Cutting Sticks
- UVa10304
- Order-Preserving Codes - gym100212C
- UVa12057
- UVa-12836
分治優化
- cf321e Ciel and Gondolas
- hr-Guardians of the Lunatics
- Chef and Bitwise OR Operation | CodeChef
- SPOJ-NKLEAVES
- hr-mining
- Bicolored Horses
- UVa12524
- cf673e Levels and Regions
- ARC 067D
斜率優化
- BZOJ 1597 [Usaco2008 Mar]土地購買
- BZOJ 3675 [APIO 2014]序列分割
- BZOJ 1010 [HNOI2008]玩具裝箱toy
- BZOJ 3437 小P的牧場
- BZOJ 3156 防御准備
- BZOJ 1096 [ZJOI2007]倉庫建設
- BZOJ 1911 APIO 2010 Commando
- BZOJ 4518 [SDOI2016] 征途
- HDU 3507
- HDU 3401
- HDU 2191
- HDU 5956 The Elder
平衡樹維護動態凸包
- cf70d
- BZOJ 2300(HAOI2011)防線修建
- BZOJ 1492 貨幣兌換Cash
- HDU 5127 Dogs’ Candies
參考文章:
- Dynamic programming with convexity, concavity and sparsity
- 《算法藝術與信息學競賽》p149。
- 1D1D動態規划優化初步
- 動態規划算法的優化技巧-毛子青
- dp優化-個人對dp優化的理解
- Dynamic Programming Optimizations
- 斜率優化 二