斜率优化DP做为1种较难理解的DP,在ACM中也有重要的作用。现有的论文或博客讲斜率优化DP要么过于抽象,要么推倒过于繁琐,这里用高中学的线性规划的知识来理解斜率优化DP,且思考方法具有一般性,可用于解决各种斜率优化问题。
以hdu3507http://acm.hdu.edu.cn/showproblem.php?pid=3507为例题。
我们很容易能推出方程F【i】= min{F【j】+(Si-Sj)^2 + M }
这是1个1D/1D的方程,即状态O(N),转移O(N),直接求效率为O(N^2)。
本题N为500000,O(N^2)显然不行!
这里,用斜率优化的方法,将转移的O(N)优化为均摊复杂度O(1),总复杂度O(N)的效率解决这个问题。
首先,将方程展开,并将带有j的项整理出来:
F【i】= min{F【j】+Sj^2-2*Si*Sj+Si^2 + M }
下一步,是斜率优化的关键,即找出一个直线方程。
令K=2*Si,X=Si,Y=F【j】+Sj^2,常数C=Si^2 + M
方程变为:
F【i】= min{Y-KX+C}
求某个F【i】,就是从前面的所有点(X,Y)的状态推来,我们开始描点。
首先分析点随这j的增加的趋势,j增加,可以推出K,X,Y都增加。