动态规划的优化

前言

动态规划在解决问题的时候,利用的是保存中间状态来减少重复的计算次数的方法来减少时间消耗的。可是在很多问题中,动态规划的时间效率,或者空间复杂度都不能满足我们的要求(超出我们的限制),这时候就要考虑对算法进行时间或者空间上的优化。

时间复杂度优化

动态规划问题总的来说还是对枚举的优化,即保存中间状态来减少计算次数的方法。那么就可以大概的认为,一个动态规划问题的时间复杂度应该是:时间复杂度 = 状态总数 * 状态转移总数 * 状态转移时间。我们只要减少任意一个部分,都可以达到加速动态规划的方式。

改进状态表示

即通过改变状态的表示方式来减少状态总数的方法。这种方法通常是一开始想出来的状态表示方法并不够好,还有我们没有发现的关系或者条件。在这种时间,我们可以对状态的表示方法进行优化,用一种更优的表示方法。这样在转义数量和转移时间不变的情况下,时间复杂度就已经被减小了。

例题

题目大意

个数字,分成 组。每组的和不能大于 。分组必须是有序的,并且保证所有的数字都是小于 的。求最多能把多少数字划入分组里。

最初的分析

这里我们用w[i]来表示第i个数的值,用dp来表示我们的结果数组。那么我们可以显然的得到一个状态表示:,来表示前 个数字,分成 组,还多了 的时候,最多有多少个数字被划入了分组中。
可以显然的得到,这里整个问题的最优解应该是 。通过状态的表示,我们可以得到状态转移方程: 这样时间复杂度应该是 的。因为总状态数是 ,每次状态转移的状态数为 ,总时间为

改进

改进后的状态表示:,表示在前 中选 个所需要的最少的分组为 另外还需要
通过状态的表示,我们可以得到状态转移方程: 其中,计算方法为: 时间复杂度从,降到了。这里空间复杂度也同时降低了。

决策单调性 · 四边形不等式

例题1

在一个操场上摆放着一排堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。求出将 堆石子合并成一堆的最小得分和最大得分以及相应的合并方案。

最初的分析

这里最大得分和最小得分的思路是一样的。这里只取最小得分来说明问题。

令每堆石子的个数为:。我们可以得到最基础的状态表示: 来表示合并第 个到第 个石子堆所获得的最小得分。得到了状态转移方程和边界条件: 并且把最优解保存在 中。(这里的 部分可以用 的时间复杂度预处理,这样直接引用就好了。)
总的时间复杂度:

改进
  • 定理1 当函数 满足 时,则称函数 满足四边形不等式
  • 定理2 当函数 满足 时,则称函数 关于区间包含关系单

在这个问题中。另 ,可以显然得到 是满足四边形不等式的,同时也满足区间包含关系单调。根据 的递推式: 对于满足四边形不等式的函数 这里我们要证明,会使 也满足四边形不等式。

这里当 或者 的时候,不等式显然成立。当 时。原式可以简化为: 的形式。设这时候取到最优值时的 。这里又分为两种情况,。只讨论前一种情况,因为后一种和前一种是镜像的。 的时候,设 取最优值,同 对于 。 这里同样要分情况 。还是只讨论前一种,后一种是相似的。 综上, 满足四边形不等式。其决策满足单调性,即:记 取最优值时的决策,有:

这里要证明一下上面的那个式子成立。 令:,要证明 ,也就是证明对于所有的 ,有: 这里有一个更强的不等式, 即: 展开得到: 这恰好是 时的四边形不等式的形式。

所以,当满足四边形不等式的时候,的取值满足单调性。

这样我们就可以改写我们的状态转移方程了,因为我们的决策的范围已经被缩小了。 时间复杂度:

例题2 Post Office

这题简单的DP是可以通过的。不过如果把数据范围扩大了,就可以用上面说的四边形不等式优化去优化。略去证明,这道题直接给出伪代码:

决策单调性 · 斜率优化

在说斜率优化之前,要先说一下另一个优化方式。当我们发现一个dp的状态转移方程形如这样的形式的时候,也就是说,一个 的结果可以化成一个于 无关的函数的和另一个只与 有关的形式的时候。我们可以对前面的和 无关的部分放在一个优先队列里,这样可以把本来 的查找代价,变成 的。

但是这终归是一个非常理想的方程啊,实际问题中这种良心满满的题目基本是没有的。所以一种把条件放的稍微弱一点的优化方式,就是斜率优化。也是通过结果和决策的关系,发现决策有事满足一些神奇的数量关系的。

例题 Print Article

状态表示:来表示,从第一个到第 个输出的最少花费。
很容易得到状态转移方程: 这个的时间复杂度可以很显然的计算出来,是 的。显然,我们是不能接受这种时间复杂度的,因为数据范围非常大。

改进

这里,我们先假设,上式中的 取值为 的时候,比取 的时候更优。也就是: 其中,这里我们可以预处理得到一个 数组。那么:,同理对于 的部分。移项得到: 其中所有的项都是我们已经计算好得到了的。我们 。上可以化成: 如果以 为Y轴,以 为X轴,那么上面个式子就是两点之间的斜率。并把这个值表示为:

然后我们来说明他们之间的单调性关系。即,若有 ,那么 这个点一定是不可能是最优解的。

证明如下
,也就是说明 更优,排除 点。 当 ,说明 更优,但是此时 ,也就是 更优,也就是 是没用的。
也就是说,对于一个 的状况下,如果有: 的话,那么 是可以删去的。也就是说,最终留下的所有有效点都满 ,也就是说整个图形呈现一个上凸的形状。如何维护图形的上凸可以用凸包的算法去解决。
唯一的就是在求解结果的时候,要从队列的头部一直找到第一个满足 的值。

伪代码

results matching ""

    No results matching ""