很久之前在网上看了传说中的四边形不等式,然后现在发现忘光了。趁比赛前夕赶快拿来熟悉一下。
一、引入
例题:Division HDU - 3480 区间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相当于只遍历了一遍区间,故三层循环退化成二层循环的复杂度。
二、证明
占坑,等南京比完赛再补