決策單調性學習筆記
\[\Large\rm 四邊形不等式優化 \]
\(\large \rm 定義\)
\(\quad\)假設有 \(p_1\leqslant p_2\leqslant p_3\leqslant p_4.\)
\(\quad\)則 \(c_{p_1,p_3}+c_{p_2+p_4}\leqslant c_{p_1,p_4}+c_{p_2,p_3}\) 被稱為四邊形不等式。
\(\quad\)假設一個問題滿足四邊形不等式,那麼它的決策點有單調性。
\(\large\rm 證明\)
\(\quad\)假設有如下問題 :現在有一個序列,我們要將其分割開來,分割一段 \([l,r]\) 的代價是 \(c_{l,r}\)
\(\quad\)設 \(F_i\) 表示將前 \(i\) 個位置分割完畢的最小代價,顯然有暴力轉移 :
\[F_i=\min\limits_{j<i}\{F_j+c_{j,i}\} \]\(\quad\)設 \(F_i\) 的決策點為 \(p_i.\) 假設存在 \(x>y,p_x<p_y.\)
\(\quad\)根據最優決策的定義寫出這個位置的轉移式 :
\[F_x=F_{p_x}+c_{p_x,x}\leqslant F_{p_y}+c_{p_y, x} \]\(\quad\)有 \(p_x<p_y<y<x\),根據四邊形不等式得到 :
\(\quad\)兩不等式相加,得到 :
\[F_{p_x}+c_{p_x,y}\leqslant F_{p_y}+c_{p_y,y} \]\(\quad\)與前文矛盾,故不存在 \(x>y,p_x<p_y\),即滿足決策單調性。
\(\large\rm 區間形式\)
\(\quad\)在實際做題中,我們經常遇到這樣的 \(\rm DP\) 方程 :
\[dp_{i,j}=\min\limits_{i\leqslant k<j}\{dp_{i,k}+dp_{k+1,j}+w_{i,j}\} \]\(\quad\)
\(\quad\)定理 \(1\) :若 \(w\) 滿足四邊形不等式,並且對於任意 \(a\leqslant b\leqslant b\leqslant c\leqslant d\),有 \(w_{a,d}\geqslant w_{b,c}\),則 \(f\) 也滿足四邊形不等式。
\(\quad\)定理 \(2\) :設 \(p_{i,j}\) 表示 \(f_{i,j}\) 的決策點,若 \(f\) 滿足四邊形不等式,則對於任意 \(i<j\),有 \(p_{i,j-1}\leqslant p_{i,j}\leqslant p_{i+1,j}.\)
\(\quad\)例題 :\(\rm [NOI1995] 石子合併\)
\[\Large\rm 轉移技巧 \]
\(\large\rm 有單峰性\)
\(\quad\)這個性質結合決策單調性有均攤轉移複雜度 \(\Theta(1)\) 的做法 :
\(\quad\)記錄一個指標表示當前的決策點,由於決策單調性所以它不會往回跳。進入每一層之後如果後面的決策點更優就跳到後面的決策點,根據單峰性這樣一定不會漏掉解。
\(\quad\)跳的次數是狀態級別的,故轉移均攤 \(\Theta(1).\)
\(\large\rm 僅有相鄰層之間轉移\)
\(\quad\)這是一類特殊的二維 \(\rm DP\),僅有相鄰層之間的轉移,沒有同層之間的轉移,同時滿足決策單調性。
\(\quad\)一般這種 \(\rm DP\) 的時間複雜度是 \(\Theta(n^3)\) 的,每次轉移需要列舉前一層的所有點。
\(\quad\)我們發現一個性質,在同一層中,先列舉哪一個是無關緊要的,因為同一層之間不會發生轉移。
\(\quad\)於是可以考慮分治,先轉移 \(mid\),得到其最優決策為 \(p\),然後就可以將區間劃分開,\([l,mid)\) 和 \((mid,r]\) 分別對應 \([tl,p]\) 和 \([p,tr].\)
\(\quad\)這樣分治時間複雜度 \(\Theta(n\log n).\)
\(\quad\)例題 :\(\rm [SDOI2016]征途\)
\(\large\rm 貢獻難算\)
\(\quad\)首先有例題 :存在一個長度為 \(n\) 的序列,要將它劃分成 \(k\) 段,每段的價值被定義為不同的元素個數,要求最大化貢價值和。
\(\quad n\leqslant 3.5\times 10^4,k\leqslant 50.\)
\(\quad\)首先有一個 \(\Theta(n^3k)\) 的暴力 \(\rm DP\),設 \(dp_{i,j}\) 表示當分到 \(i\) 時已經分了 \(j\) 段的最大價值,有轉移式 :
\[dp_{i,j}=\max\limits_{k<i}\{dp_{k,j-1}+cnt_{k+1,i}\} \]\(\quad\)其中 \(cnt_{l,r}\) 表示從 \([l,r]\) 中不同顏色的個數,單次計算需要 \(\Theta(n).\)
\(\quad\)我們發現只在相鄰層之間發生轉移,並且滿足決策單調性(直觀理解就是分得越多越容易虧),於是可以使用之前提到的分治法。
\(\quad\)這樣看起來是優化到 \(\Theta(n^2k\log n)\),但我們考慮計算貢獻的具體過程。我們每次只會計算 \(dp_{mid}\) 的值,每次詢問一個區間 \([i,mid]\) 的不同元素個數,可以考慮固定右端點移動左端點,容易發現移動次數是當前的分治區間長度,於是總移動次數不會超過 \(n\log n\),故時間複雜度實際上為 \(\Theta(nk\log n).\)
\(\quad\)例題 :\(\rm [P5574]任務分配問題\)
\[\Large\rm 常用演算法 \]
\(\large\rm 斜率優化\)
\(\quad\)假設 \(\rm DP\) 方程長成這種形式 :
\[dp_i=\max\limits_{j<i}\{dp_j+(i)'+(i)(j)+(j)'+C\} \]\(\quad\)即貢獻為一個僅與 \(i\) 有關的式子加上一個僅與 \(j\) 有關的式子加上一個與兩者都有關的乘積形式再加上一個常數,那麼可以使用斜率優化。
\(\quad\)我們發現 \(dp_i,(i)',C\) 都與決策點的選擇無關,於是可以把它們看作常數,將僅與 \(j\) 有關的式子放在一邊,可以得到方程 :
\[dp_j+(j)'=-(i)(j)+dp_i-(i)'-C \]\(\quad\)我們發現這是一次函式的形式,考慮構造平面,平面上有一些點,形如 \(((j),dp_j+(j)').\) 我們發現,如果用一條斜率為 \(-(i)\) 的直線經過某個點,那麼截距為 \(dp_i-(i)'-C.\) 由於我們要最大化 \(dp_i\),等價於最大化這個截距,所以用這根斜率為 \(-(i)\) 的直線從上到下平移,第一個碰到的點就是決策點。
\(\quad\)於是現在問題就變成了維護一個凸包,我們發現有三種情況 :
-
當加入點按照橫座標單調遞增的順序,並且詢問點單調遞增時,可以直接維護單調佇列,加入點對比隊尾斜率,取答案從隊首即可。
-
當加入點按照橫座標單調的順序時可以維護一個單調佇列,每次加入時對比斜率,取答案二分。
-
當加入點無序時直接用平衡樹 \((std :: set)\) 維護,用 \(lower\_bound\) 查詢插入點,然後向左右兩邊依次彈出,取答案也使用 \(lower\_bound.\)
\(\quad\)例題 :\(\rm [HNOI2008]玩具裝箱TOY\),\(\rm [SDOI2016]征途\)
\(\large \rm 二分佇列\)
\(\quad\)若 \(\rm DP\) 方程形如 :
\[dp_i=\min\limits_{j<i}\{dp_j+w_{j+1,i}\} \]\(\quad\)根據決策單調性的推論,任何兩個點 \(i,j(i<j)\) 之間都存在一個點 \(k\),在 \(k\) 之前一段轉移點為 \(i\),在 \(k\) 之後某一段轉移點為 \(j.\)
\(\quad\)我們發現如果能快速計算 \(w_{i,j}\),那麼就能 \(\Theta(\log n)\) 計算兩個點 \(i,j\) 之間的決策分界點。
\(\quad\)我們發現所有相鄰決策點的分界點可以用單調佇列維護,具體來說 :
-
求當前的最優決策時判斷一下隊首和隊次首誰更優,若隊首最優則決策點為隊首,否則決策點為隊次首,並且將當前隊首彈出。
-
加入一個點時判斷它是否能比隊尾更快地替換掉隊次尾,若能,則彈出隊尾,重複操作。
\(\quad\)這樣就可以快速地維護相鄰點的決策分界點了。
\(\quad\)時間複雜度 \(\Theta(n\log n).\)
\(\quad\)例題 :\(\rm [NOI2009]詩人小G\)
\(\large\rm 二分棧\)
\(\quad\)有些題可能會有這樣的奇怪性質 :每個決策點只會被自己前面的點反超。
\(\quad\)我們發現某個決策點會經歷這樣的過程 :一開始就比前面的優(否則就相當於一開始就被別人反超了),然後在最優決策的地方呆一會兒,最後被某個點反超。
\(\quad\)嚴格來說這根本不算決策單調性,但是仍然可以用二分棧來維護,因為兩點的優劣仍舊可以 \(\Theta(\log n)\) 對比。具體來說 :
- 加入一個點時,若其比堆頂劣,則直接扔掉,若其比堆頂優,則留下。
- 每一輪判斷一下堆次頂是否比堆頂優,優則將堆頂彈出。
\(\quad\)這樣堆頂就一直是當前轉移的決策點。
\(\quad\)例題 :\(\rm [POI2011]Lightning Conductor\)
\(\large\rm SMAWK演算法\)
\(\quad\)咕咕咕 \(......\)