前言
四邊形不等式是一種動態規划優化方法,通過對決策單調性的證明及應用,使得總體復雜度降低一個數量級。目前我見過的四邊形不等式的題目不多,且大多數比較裸。四邊形不等式的常見模型及其基礎應用並不難,難點在於與四邊形不等式相關的證明,尤其是題目中出現以前沒有見過的轉移方程的時候。由於本人數學很渣,所以問了很多大神,嘗試了各種方法繞過證明。這里把我的經驗分享給大家,尤其是像我一樣的數學不好的同學。所以,本文並沒有證明相關的東西,如果大家想看證明,可以閱讀趙爽的文章《動態規划加速原理之四邊形不等式》,百度文庫上應該有免費下載。
一種基本形式
四邊形不等式的基本形式非常簡單,用於常見的區間dp的優化。
轉移方程形式為f[i][j] = min{ f[i][k] + f[k+1][j] + w(i,j) | i <= k < j }。
這個方程大家再熟悉不過了,長區間可以從短區間轉移過來,w(i,j)表示將閉區間[i,j]合並產生的費用,狀態有O(n^2)個,每個狀態的決策有O(n)個,總復雜度為O(n^3)。
現在用四邊形不等式對其優化,首先需要知道什么是四邊形不等式。
若函數w(i,j)滿足w(a,c) + w(b,d) <= w(a,d) + w(b,c),其中a <= b < c <= d,則稱w滿足四邊形不等式。可以看做一個以(a,c)為左上角,(b,d)為右下角的矩陣中,左上角的值加上右下角的值小於左下角的值加上右上角的值。注意我們要求b < c,因為在實際的區間問題中,既然w(b,c)表示合並區間[b,c]的費用,那么b一定是小於等於c的。在這個限制下,如果把我們所有的狀態寫成一個矩陣的話,有用的狀態一定是行號小於等於列號的,即所有有用的狀態f[i][j]中,i <= j。
若函數w(i,j)滿足w(a,d) >= w(b,c),其中a <= b <= c <= d,則稱w關於區間包含關系單調。可以看做長區間的值大於等於它包含的短區間的值。
設使f[i][j]取到最小值的k為p[i][j],即在方程f[i][j] = min{ f[i][k] + f[k+1][j] + w(i,j) | i <= k < j }中,k = p[i][j]時,f[i][j]取到最小值。
那么有如下定理:
1.若w滿足四邊形不等式,且關於區間包含關系單調,則f也滿足四邊形不等式。
2.若f滿足四邊形不等式,則p[i][j-1] <= p[i][j] <= p[i+1][j],即如果把p看做一個矩陣的話,p在每一行上單調非降,在每一列上單調非降。
3.w滿足四邊形不等式,當且僅當w(i,j) + w(i+1,j+1) <= w(i+1,j) + w(i,j+1)。
這三個定理我就不在這里證明了,大家可以去看前言中提到的那篇論文。其中第三個定理可以用來證明w滿足四邊形不等式,我們主要使用第二個定理優化dp。
具體如何優化呢?我們原來在計算f[i][j]的時候,枚舉的k值范圍是[i,j),所以單次轉移的復雜度是O(n),現在,我們既然知道了p[i][j-1] <= p[i][j] <= p[i+1][j],我們只需要把k的枚舉范圍改成p[i][j-1]至p[i+1][j]就好了!總體復雜度就變成了O(n^2)了!注意這里是閉區間,即p[i][j-1]和p[i+1][j]都能取到。下面給出簡單證明。
對於固定的區間長度len,有
f[i][i+len]的決策范圍為p[i][i+len-1]至p[i+1][i+len]
f[i+1][i+len+1]的決策范圍為p[i+1][i+len]至p[i+2][i+len+1]
f[i+2][i+len+2]的決策范圍為p[i+2][i+len+1]至p[i+3][i+len+2]
如此腦補下去,我們發現,對於固定的區間長度len,總共的決策只有O(n)個!因為一共有O(n)個不同的區間長度len,所以算法的總復雜度就是O(n^2)!
我們干了什么?首先需要證明w滿足四邊形不等式,然后只需要記錄一下每個f[i][j]的決策點,並且改一下k的枚舉范圍,就能把時間復雜度降一個量級。
如何繞過證明
四邊形不等式優化代碼十分簡單,且效果也很好,但是最令人頭疼的就是如何證明w滿足四邊形不等式。
有可能這個對大家還比較容易,但是要知道,滿足這些性質的轉移方程不止這一種!對於f[i][j] = min{ f[i-1][k] + w(k+1,j) | i-1 <= k < j }這個方程來說,若w滿足四邊形不等式,f同樣滿足四邊形不等式,也可以使用決策單調性優化,但是證明就比較困難了。YJQ教給我一種很好的繞過證明使用四邊形不等式的方法,但是使用起來不是那么簡單,有一些注意事項。下面的內容可就是別人博客里沒有的東西了!
大致方法很簡單,如果我們覺得一個方程能用四邊形不等式優化,就把他的所有決策點,也就是p矩陣打印出來,觀察一下在每行每列上是否單調,如果單調,就說明這個方程可以用四邊形不等式優化。不過需要小心一些地方。
首先,注意決策點應該在哪些范圍之內單調,比如對於區間dp的方程來說,決策點的單調范圍就應該是行號小於等於列號的那一部分。這點在實際問題中應該很容易體現出來,比如對於區間dp,行號大於列號的那些狀態肯定是無用的,決策單調性也肯定不關它們什么事。
其次,應該注意遞推時枚舉的順序和狀態之間的依賴關系。比如對於上面那個方程來說,決策矩陣p在每行每列單調遞增,所以應該把k的枚舉范圍該成p[i-1][j]至p[i][j+1],注意這里和區間dp就不一樣了,所以應該根據狀態之間的依賴關系靈活調整枚舉范圍。而且,如果我們遵循這樣的依賴關系,就應該有p[i][j]依賴於p[i][j+1],所以k應該從大到小倒着枚舉。
而且,能不能用四邊形不等式優化貌似還和狀態定義,和轉移方程有關。所以可能會出現某種狀態定義可以優化而另外一種不能的情況?我還沒遇到過(已經開始口胡了)。。。
總結
其實四邊形不等式雖然很神,但是題目不算多,轉移方程也就那么幾種,特征也比較明顯。至於定理什么的,實在不會證明記住就好了,然后檢驗決策單調性的話就打個表,畢竟OI中不需要我們會證明的東西還不是一抓一大把(逃)。
順便說一下,與四邊形不等式相關的優化,還有一個叫凸完全單調性,也是證明之后利用決策單調性優化。這個我不會,大家可以去百度文庫搜楊哲的ppt《凸完全單調性的加強與應用》看看。
習題(轉自他人博客)
Lawrence HDU 2829
Post Office IOI 2000 POJ 1160
Monkey Party HDU 3506
參考資料
劉汝佳《算法藝術與信息學競賽》