1. 程式人生 > >四邊形不等式(dp優化)應用及證明(石子合併n^2)

四邊形不等式(dp優化)應用及證明(石子合併n^2)

石子合併是一道很經典的區間動規。

在n^3的暴力裡面,我們的狀態轉移方程是:

f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+w[i][j])

現在我們有一種很牛逼的優化,可以把石子合併優化到接近O(n^2)

四邊形不等式

我們先來看滿足四邊形不等式的條件:若a<b<=c<d
如果有w[a][c]+w[b][d]<=w[a][d]

+w[b][c](交叉小於包含)(凸四邊形不等式)
那麼滿足四邊形不等式優化。

定理1:如果w滿足凸四邊形不等式,那麼f也滿足凸四邊形不等式
定理2:如果f滿足凸四邊形不等式,我們定義s[i][j]f[i][j]在狀態轉移時取得k為最優,那麼s[i][j]=k,此時是s[i][j]滿足決策單調性,也就是s[i][j1]<=s[i][j]<=s[i+1][j]

首先我們先跳過定理的證明(假裝我們明白了這些定理的證明咳咳咳),來看看如何通過定理來優化。

既然知道了這個定理,那我們就可以優化掉原本k的那一層迴圈,轉化為優美的O(n^2)啦

程式碼:

    for(int l=3;l<=n;++l)
     for(int i=1;i<=n-l+1;++i)
      {
        int j=i+l-1;
        dp[i][j]=INF;
        for(int k=s[i][j-1];k<=s[i+1][j];++k) 
         if((dp[i][k]+dp[k+1][j]+a[j]-a[i-1])<dp[i][j])
          s[i][j]=k,dp[i][j]=dp[i][k]+dp[k+1
][j]+a[j]-a[i-1]; }

ps:O(n)預處理出s[i][i+1]與dp[i][i+1]

簡單證明

下面我們來證明幾個定理。
假設我們已經證明出了w[a][c]+w[b][d]<=w[a][d]+w[b][c]a<b<=c<d
現在我們來推導f函式也滿足四邊形不等式。
假設s[a][d]=s,s[b][c]=t
由於對稱性,我們可以假設s<t(也就是說反過來也可以)
那麼我們可以得到s+1<t+1<c<d
那麼
f[a][c]+f[b][d]<=f[a][s]+f[s+1][c]+w[a][c]+f[b][t]+f[t+1][d]+w[b][d]
<=f[a][s]+f[s+1][c]+f[b][t]+f[t+1][d]+w[a][d]+w[b][c]