1. 程式人生 > >【教程】四邊形不等式學習筆記

【教程】四邊形不等式學習筆記

前言

  四邊形不等式是一種動態規劃優化方法,通過對決策單調性的證明及應用,使得總體複雜度降低一個數量級。目前我見過的四邊形不等式的題目不多,且大多數比較裸。四邊形不等式的常見模型及其基礎應用並不難,難點在於與四邊形不等式相關的證明,尤其是題目中出現以前沒有見過的轉移方程的時候。由於本人數學很渣,所以問了很多大神,嘗試了各種方法繞過證明。這裡把我的經驗分享給大家,尤其是像我一樣的數學不好的同學。所以,本文並沒有證明相關的東西,如果大家想看證明,可以閱讀趙爽的文章《動態規劃加速原理之四邊形不等式》,百度文庫上應該有免費下載。

一種基本形式

  四邊形不等式的基本形式非常簡單,用於常見的區間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

參考資料

  劉汝佳《演算法藝術與資訊學競賽》