1. 程式人生 > 其它 >四邊形不等式與決策單調性

四邊形不等式與決策單調性

四邊形不等式與決策單調性

四邊形不等式

首先,給出四邊形不等式的定義:

定義一

\(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\)

,比較當它的決策點為 \(i\) 時與決策點為 \(p[k]\) 時的大小,若前者更優,那我們就把它和它之後所有點的決策換為 \(i\) ,即 \(p=\{ j_1j_1j_2j_2j_2j_3iiiiiii \}\)

這麼做相當於我們實現了動態更新 \(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)\) 插入隊尾。
作者: ╰⋛⋋⊱๑落葉๑⊰⋌⋚╯

-------------------------------------------

海到無邊天作岸,山登絕頂我為峰!