【转】1D/1D DP 优化总结_from kAc

这几天做了各种1D/1D的DP优化,小小总结一下

1D/1D DP 通式

f[i] = max/min{f[j] + w[i,j]} + 与i有关的常数 (有时候j还有个取值范围)

这个方程有三种优化思路


1、最简单的情况,w[i,j] 可以分离,即w[i,j] = g[i] + g[j],可以化成这种形式的话,就可以吧g[i]拿出来,变成

      f[i] = max/min{f[j] + g[j]} + g[i] +常数

      这个方程,如果j的取值下界单调不降(即查询区间没有包含)那么是可以用单调队列解决的,否则需要其他数据结构(线段树?)


2、w[i,j]满足w[i,j]-w[i,j+1]有单调性,这个时候有一个神奇的性质,就是决策是单调不降的,这样我们可以维护一个双端队列,存储每一个f[j]可以用于更新哪些i,在得到新的f[j]的时候可以二分查找出他的应用范围(因为单调性)

     这个对式子中的j不能有取值范围,由于二分查找,时间复杂度O(N lg N)


3、w[i,j]是a[i] * b[j]的形式,这个时候我们可以把一个状态j看成一个点,(b[j],f[j]),而上面式子可以写成

      f[i] = max/min {y + k * x}

      y = - k * x + f[i]

      决策的意义是:过所有状态点做一条斜率为-k的直线,求最小/大截距,这时候可以发现最优决策点一定在凸壳上

      如果b[j]、-k同时具有某种单调性,那么我们是可以用单调队列解决的,否则需要维护一棵平衡树,平衡树的方法有些复杂(尤其是平衡树的编写上)请参考其他NOI2007 货币兑换的解题报告

posted @ 2013-01-23 07:07  wsc500  阅读(501)  评论(0编辑  收藏  举报