1. 程式人生 > >區間dp 與 四邊形不等式優化 學習筆記

區間dp 與 四邊形不等式優化 學習筆記

部落格目錄

很久之前在網上看了傳說中的四邊形不等式,然後現在發現忘光了。趁比賽前夕趕快拿來熟悉一下。

一、引入

形如:

dp[i][j]=min{dp[i][k]+dp[k+1][j]+cost[i][j]}

的狀態轉移方程,如果不加優化的話ijk三層迴圈O(n^3)的複雜度是難以接受的。考慮四邊形不等式優化。其中k相當於決策,下面用sp[i][j]來表示k最優的決策。

1.四邊形不等式

對於( a < b <= c< d )若有

f[a][c]+f[b][d]<=f[b][c]+f[a][d]

則說這個東西滿足四邊形不等式,當然這個東西可能是dp陣列,也可以是其他陣列,比如引入裡提到的cost陣列,表示的是i到j的花費(比如合併石子問題)

2.重要定理(判斷此方程是否可以四邊形優化)

設s[i][j]是dp[i][j]取到最優解的k值,即s[i][j]是最優決策。

若上述花費陣列cost滿足四邊形不等式,則dp方程也滿足四邊形不等式。

若dp方程滿足四邊形不等式,則決策s單調,即s[i][j-1]<=s[i][j]<=s[i+1][j] 

進而有:(對於上述dp方程來講,下同)

若cost滿足四邊形不等式,則決策s也滿足四邊形不等式,即

設(i < i+1 <= j<j+1),有:

s[i][j-1]<=s[i][j]<=s[i+1][j] 

3.已有結論,如何優化?

對於dp方程:

dp[i][j]=min{dp[i][k]+dp[k+1][j]+cost[i][j]}

若已知s[i][j-1]<=s[i][j]<=s[i+1][j](要記住s陣列是k的最優決策),則:

  • 對於j來說,s[i][j]無後效性
  • 對於i來說,s[i][j]無前效性

故倒序迴圈i,正序迴圈j(當然對於特定的問題i和j也有範圍限制來減小時間常數)

然後根據每一個i,j,都已知dp[i][j-1]的最優決策k=s[i][j-1]、和dp[i+1][j]的最優決策k=s[i][j+1],又因為當前狀態dp[i][j]的最優決策k=s[i][j]滿足s[i][j-1]<=s[i][j]<=s[i+1][j],所以k只需要在s[i][j-1]到s[i+1][j]之間列舉即可。而這個區間在整個三重迴圈內是一直向內縮小的,所以整個三層迴圈的k相當於只遍歷了一遍區間,故三層迴圈退化成二層迴圈的複雜度。

二、證明

佔坑,等南京比完賽再補

參考部落格