四邊形優化
凸性優化
凸完全單調性
\(dp_{j} = max(f(i, j))\)
對於所有的轉移點 \(i, j(i < j)\) 滿足
存在一個 \(k\) 使得
\(\forall x < k, f(i, x) \geq f(j, x)\)
\(\forall x \geq k, f(i, x) \leq f(j, x)\)
白話的說,就是對於所有轉移點 \(i, j(i < j)\)
都存在一個時刻 \(k\)
使得在接下來從 \(j\) 轉移都會比從 \(i\) 轉移好
另外一個角度
在大部分的時候,式子長這樣
\(dp_j = max(dp_i + cost(i, j))\)
也就是說 \(f(i, j) = dp_i + cost(i, j)\)
通常在題目裡面 \(cost(i, j)\) 會有單調性。
有點難解釋是什麼樣的單調性。
先看例題
tioj 1283
P1
P2
Q1
Q2
P2 從 Q2
轉移比從 Q1
多獲得的
P2 從 Q2
轉移比從Q1少拿到的
整理一下
對於兩個點 \(p1, p2\) 還有轉移來源 \(q1, q2\)
我們定義 \(cost(a, b) := b 從 a 轉移的額外 cost\)
也就是有 \(dp_j = max(dp_i + cost(i, j))\) 的時候只考慮 cost
那單看 cost 的時候
\(p1\) 從 \(q2\) 轉移而不從 \(q1\)時,他的損失就是
\(cost(q2, p1) - cost(q1, p1)\)
而同理,對 \(p2\) 也是
\(cost(q2, p2) - cost(q1, p2)\)
整理一下
定義 \(gain_{p1,q2} = cost(q2, p1) - cost(q1, p1)\)
\(gain_{p2, q2} = cost(q2, p2) - cost(q1, p2)\)
如果 \(gain{p1, q2} < gain{p2, q2}\)
(p1 從 q2 轉移額外獲得的比 p2 從 q2 額外獲得的還要少)
而且 \(p1\) 是從 \(q2\) 轉移,那接下來顯然 \(p2\) 不可能從 \(q1\) 轉移。
所以可以推出有轉移點單調。
同時也有凸完全單調性。
接下來的例題,都可以用這種手法來證明。
符合優超性就會有凸完全單調,但是凸完全單調不保證有優超性。
優化處理方法 1:
維護單調隊列,裡面放轉移來源,同時維護該轉移來源什麼時候會比前一個好
每次有新的來源時 從尾端看
假如 單調隊列 的 back 為 \(X\), 要加進來的是 \(Y\)
那就可以二分搜看 \(Y\) 什麼時候會開始比 \(X\) 還要好。
如果 \(Y\) 超過 \(X\) 的時刻早於 \(X\) 超過 單調隊列 中前一項的時刻,那 \(X\) 就永遠都不會被用到。這時候就把 \(X\) 給丟掉。
查詢的時候,只要目前用 單調隊列 中第二項轉移比第一項好,就把第一項丟掉,這樣就做完了 !
優化處理方法 2:
分治法
因為我們有轉移點單調,所以可以先給出遞迴式
\(solve(L, R, FL, FR)\) 代表要算出 \([L, R)\) 內的答案,
而且轉移來源只會介於 \([FL, FR)\)
那只要每次\(O(FR-FL)\) 找出 \(M = (L+R)/2\) 的轉移來源
並且遞迴下去,每一層的複雜度都是 \(O(N)\) 且 最多\(\text{log}N\) 層
總複雜度 \(O(N\text{log}N)\)
可是如果 \(dp\) 為 \(dp_j = dp_i + cost(i, j)\) 的話,就必須套一層 CDQ 。多一個 log ,這題是因為單純轉移點單調,且dp 式沒有用到前一項的 dp 值才可以
例題
TIOJ 1347
給你一個長度 \(N\) 的正整數序列 \(A_1 ∼ A_N\)、
一個長度 \(N − 1\) 的正整數序列\(L_1 ∼ L_{N−1}\) 和兩個正整數 \(K, P\) ,請你將區間分割成若干段,對於每段 \([l, r]\),令總和
\(M = \sum_{i=l}^{r}{A_i}\)
則 \(cost = |M-K |^P\)
且當你把 \(i\) 和 \(i + 1\) 分在同一塊時,也會獲得 \(Li\)
的權重,試問分段後的最小cost 總和。
列出 DP
\(dp_i = min(dp_j + cost(j, i))\)
\(cost(j, i) = \sum_{k=j}^{k<i}{L_k} + A[j, i]^P\)
CF 868F
給你一個長度 \(N\) 的整數序列 \(a_1 ∼ a_N\),請你將區間分割成 \(K\) 段,每段的權重是滿足 \(a_i = a_j\) 的無序數對個數,試問最小權重和。
ARC 67 F
給\(N \times M, (N \leq 5 \times 10^3, M \leq 200)\)二維陣列 \(A_{i,j}\)
求 \(max _{l, r}(\sum_{i = 1}^{M}{\max_{l \leq k \leq r}(A_{k, i}) - (r-l+1))}\)
POI 2014 R3D2 Freight
有個隧道,一次只能容納一台車
隧道的左測入口有 \(N(N\leq10^6)\) 台車,第 \(i\) 台在
時間 \(T_i(T_i \leq 10^9)\) 後才出發。
而且在同一個時間點,不能同時有兩台車進隧道。
已知需要 \(S(S \leq 10^9)\) 單位時間,從隧道頭開到隧道尾。
現在要讓所有車都從隧道左側走到右側,再從右側走到左側。
最後一台車從左邊出來的最早時間為多少?
凹性優化
凹完全單調性
\(dp_{j} = min(f(i, j))\)
對於所有的轉移點 \(i, j(i < j)\) 滿足
存在一個 \(k\) 使得
\(\forall x < k, f(i, x) \geq f(j, x)\)
\(\forall x \geq k, f(i, x) \leq f(j, x)\)
白話的說,就是對於所有轉移點 \(i, j(i < j)\)
都存在一個時刻 \(k\)
使得在接下來從 \(i\) 轉移都會比從 \(j\) 轉移好
看起來就是和剛剛恰好相反,這種形式就是
當一個新的轉移來源進來的時候,會先成為最佳轉移點。
不過在某個時刻後,他就會變差,再也用不到。
優化處理方法 :
維護單調隊列,裡面放轉移來源,同時維護該轉移來源什麼時候會比前一個差
每次有新的來源時 從尾端看
假如 單調隊列 的 back 為 \(X\), 要加進來的是 \(Y\)
那就可以二分搜看 \(X\) 什麼時候會開始比 \(Y\) 還要好。
如果 \(X\) 超過 \(Y\) 的時刻早於 deque 中前一項 超過 \(X\) 時刻,那 \(X\) 就永遠都不會被用到。這時候就把 \(X\) 給丟掉。
查詢的時候,只要目前用 deque 中倒數第二項轉移比倒數第一項好,就把倒數第一項丟掉,這樣就做完了 !
例題
USACO 2019 Feb Mowing
給定\(T, N\) ,在二維平面上有 \(N(N \leq 2 \times 10^5)\) 個黑點 \(X_i, Y_i(X_i, Y_i \leq T\),其他點都是白點
現在要從 \(0, 0\) 走到 \(T, T\) 只能往上或往右
一種經過 \(K\) 個黑點走法的美度為 \(K\)
令 \(P_i\) 為路上經過的第 \(i\) 個黑點
且 \(P_0 = (0,0), P_{K+1} = (T,T)\)
則這個走法的權重為 \(\sum_{i=0}^{K}{area(P_i, P_{i+1})}\)
求最美的走法中,最小權重是多少
四邊形優化
By Kevin Zhang
四邊形優化
- 1,138