dp优化

· · 个人记录

最近一直在搞dp的优化,心血来潮就想写一写

首先最简单的优化

前缀和优化

可以说这个优化相当不数学,只需敏锐观察,就可以了。 大概可以将O(n^t)降到O(n^{t-1}),但常数扩大

矩阵优化

一般也比较简单。但你做过通过一系列数学变化加上敏锐观察,矩阵本身计算可以将常数t^3降为 1 的题吗?

这种优化应用常见,但也只能应用到一些递推型的dp方程,对于一些复杂的,涉及到取minmax的dp,这个就用不上了

决策单调性优化

这个分为很多种,应用最广也最灵活,也最难,也最数学

一般初级的,有四边形不等式。

四边形不等式很基础,也很好用。一般,形如w[i][j]+w[i+1][j+1]\leq w[i][j+1]+w[i+1][j],i<j的都叫做满足四边形不等式。 满足此不等式等价与满足凸完全单调性。值得注意的是,不等式也可以把\leq换成\geq,此时,dp方程取max而不是min

如何一眼看出?有下例几种推论。

  1. 一般前缀和类型都满足。比如说w[i][j]表示成一些关于前缀和的式子(不带乘法,开根等,只带加减)。值得注意的是,当w[i][j]+w[i+1][j+1]= w[i+1][j]+w[i][j+1]时,同样视为满足该不等式.
  2. 一般的,若w[i][j]满足了,w[i][j]为前缀和形式记p[i][j]=w[i][j]*w[i][j] p[i][j]也满足,前提是为前缀和形式
  3. 上述的p[i][j]可以等于两个不同但与w[i][j]类似的式子(考场最好证一下)
  4. 最后还可以打表证一下

应用上述不等式,首先是证w[i][j]也就是权函数满足

然后有两种应用,

以上讲述的只是区间dp的优化,更多更广的,是一类形如f[i]=max f[j]+w[i][j]的优化

一样的,先是证明w[i][j]满足该不等式,然后再巧妙证明其决策单调性。证明方法因题而异

但主要思路如下

  1. 首先是判断单调性是递减还是递增。一般来说,如果i是从小到大枚举的,那么会是递增。这个单调性的意思是如果i<j,f[i]的最优决策k_1\leq f[j]的最优决策k_2,函数图像自行脑补
  2. 判断完了后依旧反证。

证出来了之后呢,把之前讲的函数图像另一种角度看,你会发现,每一个决策后对应一段区间,这个时候,优化显然。具体来说就是维护一个队列,队首始终为当前最优决策,如果队首已经不是最优,那么就把它弹掉。 对于当前枚举到的i对它决策完后,立马把它作为一个新的决策加入该队列。具体来说就是对于每个决策S来说,都有一个区间[l,r] 意思是f[l]f[r]的最优决策都是S,但如果当前在加入i时发现,队尾决策S对应的l在把i当作决策点s时更优,显然,S丧失了作用,最后再与队尾决策二分找出加入决策i的最优决策范围

可以发现,由于随后需要二分找范围