【决策单调性分治优化】对于一类DP状态方程的优化讲解

前言

之前直接拿板子来用,也不知道是什么原理...

这次下定决心把它搞懂(其实是因为期末考试要考orz...)

参考:老师讲课课件

关于一类DP状态方程的优化

对于形如:dp[ i ][ j ] = min( k < j ){ dp[ i - 1 ][ k ] +cost[ k ][ j ] }

其中cost[ k ][ j ]表示从k到j的权值函数值。
若第一维的范围是1~K,第二维的范围是1~N,则朴素方法的时间复杂度为O(KN^2)
如果满足决策单调性,则可以用分治的方法把时间降到O(KNlogN)
该方法简单实用,不需要维护额外的数据结构,好想好写。

虽然此类DP状态方程可以进一步降低复杂度,但在时间紧张的情况,可以作为一种较理想的实现方法。
国外资料上常把此类优化称为“ Divide and Conquer Optimization”

决策单调性分治优化

解决此类问题的前提是证明或者观察出DP状态的决策点具有单调性。
令opt[ i ][ j ]表示最小的k满足dp[ i ][ j ] = dp[ i ][ k ] + cost( k+1...j )
因为有决策单调性,因此决策点有这样的性质:
opt[ i ][ 1 ] <= opt[ i ][ 2 ] <= ... <= opt[ i ][ n ]
这有什么用呢?
设第二维的n=200,我们已经算出了所有i=3的状态值,现在要计算i=4的各个状态。
我们首先暴力计算出二分点mid = 100时的状态值dp[4][100],同时得到了最优决策点opt[4][100]。
根据决策单调性,在后续计算dp[4][1]..dp[4][99]的过程中,最优决策点一定是在1..opt[4][100]中。同理, dp[4][101]..dp[4][200]的最优决策点一定在是opt[4][100]..n中。于是就可以递归分治解决。

个人感觉有点像二分...但是这个方法是建立在【四边形不等式】的基础上的——这意味着我还要好好学四边形不等式及其优化!orz

练习题

1.监狱狱警:https://blog.csdn.net/qq_36294918/article/details/103834106

2.阿拉伯的劳伦斯 Lawrence of Arabia:https://blog.csdn.net/qq_36294918/article/details/103834688

你可能感兴趣的:(决策单调性分治优化,总结&心得,决策单调性分治优化,DP优化)