四邊形不等式與決策單調性
四邊形不等式與決策單調性
四邊形不等式
首先,給出四邊形不等式的定義:
定義一
設 \(w(x,y)\) 是定義在整數集合上的二元函式,若對於定義域上的任意整數 \(a,b\) ,其中有 \(a<b\) ,都有:
\[w(a,b+1)+w(a+1,b) \ge w(a,b)+w(a+1,b+1) \]則稱函式 \(w\) 滿足四邊形不等式。
定義二
設 \(w(x,y)\) 是定義在整數集合上的二元函式,若對於定義域上的任意整數 \(a,b,c,d\) ,其中有 \(a\le b\le c\le d\) ,都有:
\[w(a,d)+w(b,c) \ge w(a,c)+w(b,d) \]則稱函式 \(w\)
方便記憶:交叉小於包含
簡單證明一下定義二:
決策單調性
定義
形如 \(f[i]=min \{ f[j]+val(j,i) \} (0\le j\le i)\) 的狀態轉移方程,如果 \(p[i]\) 為狀態 \(f[i]\) 的決策,並且陣列 \(p\) 在 \([1,N]\) 上單調不減,簡稱 \(f\) 具有決策單調性。
還有一個性質,形如上述的狀態轉移方程中,若 \(val(j,i)\) 符合四邊形不等式,那麼 \(f\) 具有決策單調性。
看到最後的式子,即決策點 \(p[i]\) 一定不劣於決策點 \(j\) ,並且 \(j<p[i]\) ,即得證。
用法
顯然,最簡單的優化為將狀態轉移方程寫作:
\[f[i]=min \{ f[j]+val(i,j) \} ( p[i-1]\le j\le i ) \]即縮小了決策範圍,但這樣做卻不一定能更優,例如 \(p=\{ 1,1,1,1,1,1,1,1 \}\)
所以我們肯定存在其他方法。
當迴圈到某一個 \(i\) 時, 有可能 \(p=\{ j_1j_1j_2j_2j_2j_3j_3j_3j_4j_4j_5j_5j_5 \}\)
其中 \(j_1<j_2<j_3<j_4<j_5<i\)
當求解出 \(f[i]\) 後,我們即可以更新 \(p\) ,也就是找到一個點 \(k\)
這麼做相當於我們實現了動態更新 \(p\) 陣列。
但這個過程該如何實現呢?暴力的效率是相當低的,不能達到我們的優化目的。
考慮使用一個佇列代替 \(p\) 陣列,佇列中儲存若干個三元組 \((j,l,r)\) ,其中 \(j\) 為決策, \(l,r\) 為區間。
例如:
\(p=\{ j_1j_1j_2j_2j_2j_3j_3j_3j_4j_4j_5j_5j_5 \}\) 可以表示為 \((j_1,1,2)(j_2,3,5)(j_3,6,8)(j_4,9,10)(j_5,11,13)\)
當更新 \(i\) 的時候,發現 \((j_4,9,10)(j_5,11,13)\) 的左端點的決策都比 \(i\) 更劣,從佇列中將其刪去。但是 \((j_3,6,8)\) 左端點比 \(i\) 更優,右端點比 \(i\) 劣,那我們就二分找到一箇中間點更新即可。
如何通過這個佇列維護求解 \(f\) 陣列,實際上它是個動態更新的過程,但顯然前面已經使用過的都是我們不需要的,每次用完過後將其出隊,這樣每次更新 \(f\) 的值我們就只需要取出隊頭即可。
總結
上述過程有些凌亂,此部分梳理一下其具體過程
-
對於每個 $i\in [1,N] $ ,我們執行一下操作:
- 檢查隊頭 \(( j_0,l_0,r_0 )\) ,若 \(r_0<i\) ,刪除隊頭,否則:\(l_0=i\) 。
- 取出隊頭 \(j\) ,作為最優決策,算出 \(f[i]\) 。
- 插入決策 \(i\)
- 取出隊尾 \((j_t,l_t,r_t)\) 。
- 如果對於 \(f[l_t]\) ,\(j_t\) 劣於 \(i\) ,即 \(f[i]+val(i,l_t) \le f[j_t]+val(j_t,l_t)\) ,刪除隊尾,記 \(pos=l_t\) 。
- 如果對於 \(f[r_t]\) ,\(j_t\) 優於 \(i\) ,則將 \((i,pos,N)\) 插入隊尾,結束該過程。
- 如果上述兩點都不滿足,則在 \([l_t,r_t]\) 中進行二分,找到最小 \(pos\) 滿足 \(f[i]+val(i,pos) \le f[j_t]+val(j_t,pos)\) ,則將 \((j_t,l_t,pos-1),(i,pos,N)\) 插入隊尾。
-------------------------------------------
海到無邊天作岸,山登絕頂我為峰!