动态规划的实质是分治和解决冗余,因此动态规划也是递归思想的应用之一。但是,动态规划和递归法还是有区别的。一般我们在实际应用中遇到的问题主要分为四类:判定性问题、构造性问题、计数问题和最优化问题。动态规划是解决最优化问题的有效途径,而递推法在处理判定性问题和计数问题方面是一把利器。下面分别就两个例子,谈一下递推法和动态规划在这两个方面的联系。
[例13] 模四最优路径问题
在下图中找出从第1点到第4点的一条路径,要求路径长度mod 4的余数最小。

这个图是一个多段图,而且是一个特殊的多段图。虽然这个图的形式比一般的多段图要简单,但是这个最优路径问题却不能用动态规划来做。因为一条从第1点到第4点的最优路径,在它走到第2点、第3点时,路径长度mod 4的余数不一定是最小,也就是说最优策略的子策略不一定最优——这个问题不满足最优化原理。
但是我们可以把它转换成判定性问题,用递推法来解决。判断从第1点到第k点的长度mod 4为sk的路径是否存在,用fk(sk)来表示,则递推公式如下:
边界条件为


这里lenk,i表示从第k-1点到第k点之间的第i条边的长度,方括号表示“或(or)”运算。最后的结果就是可以使f4(s4)值为真的最小的s4值。
这个递推法的递推公式和动态规划的规划方程非常相似,我们在这里借用了动态规划的符号也就是为了更清楚地显示这一点。其实它们的思想也是非常相像的,可以说是递推法借用了动态规划的思想解决了动态规划不能解决的问题。
有的多阶段决策问题(像这一题的阶段特征就很明显),由于不能满足最优化原理等使用动态规划的先决条件,而无法应用动态规划。在这时可以将最优指标函数的值当作“状态”放到下标中去,从而变最优化问题为判定性问题,再借用动态规划的思想,用递推法来解决问题。
[例14] 钉子与小球 (NOI'99)
有一个三角形木板,竖直立放,上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如下图a)。每颗钉子和周围的钉子的距离都等于d,每个格子的宽度也都等于d,且除了最左端和最右端的格子外每个格子都正对着最下面一排钉子的间隙。
让一个直径略小于d的小球中心正对着最上面的钉子在板上自由滚落,小球每碰到一个钉子都可能落向左边或右边(概率各1/2),且球的中心还会正对着下一颗将要碰上的钉子。例如图b就是小球一条可能的路径。
我们知道小球落在第i个格子中的概率为:

其中i为格子的编号,从左至右依次为0,1,...,n。
现在的问题是计算拔掉某些钉子后,小球落在编号为m的格子中的概率pm。假定最下面一排钉子不会被拔掉。例如图3是某些钉子被拔掉后小球一条可能的路径。
图a 图b 图c
输入:
第1行为整数n(2<=n<=50)和m(0<=m<=n)。
以下n行依次为木板上从上至下n行钉子的信息,每行中‘ * ’表示钉子还在,‘ . ’表示钉子被拔去,注意在这n行中空格符可能出现在任何位置。
输出:
仅一行,是一个既约分数(0写成0/1),为小球落在编号为m的格子中的概率pm。
既约分数的定义:A/B是既约分数,当且仅当A、B为正整数且A和B没有大于1的公因子。
样例输入:
5 2
*
* .
* * *
* . * *
* * * * *
样例输出:
7/16
这个题目一看就不觉让人想起一道经典的动态规划题。下面先让我们回顾一下这个问题。
[例15] 数字三角形(IOI'94)
在下图中求从顶至低某处的一条路径,使该路径所经过的数字的总和最大,每一步只能向左下或右下走。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在这个问题中,我们按走过的行数来划分阶段,以走到每一行时所在的位置来作为状态,决策就是向左下走(用0表示)或向右下走(用1表示)。
状态转移方程:

规划方程:

边界条件:

这是一个比较简单的最优化问题,我们还可以把这个问题改成一个更加简单的整数统计问题:求顶点到每一点的路径总数。把这个总数用fk(xk)表示,那么递推公式就是:

在这里,虽然求和公式只有两项,但我们仍然用∑的形式表示,就是为了突出这个递推公式和上面的规划方程的相似之处。这两个公式的边界条件都是一模一样的。
再回到我们上面的“钉子与小球”问题,这是一个概率统计问题。我们继续沿用上面的思想,用fk(xk)表示小球落到第k行第xk个钉子上的概率,则递推公式如下:

这里函数Existk(xk)表示第k行第xk个钉子是否存在,存在则取1,不存在则取0;
边界条件

可以看出这个公式较之上面的两个式子虽然略有变化,但是其基本思想还是类似的。在解这个问题的过程中,我们再次运用了动态规划的思想。
一般说来,很多最优化问题都有着对应的计数问题;反过来,很多计数问题也有着对应的最优化问题。因此,我们在遇到这两类问题时,不妨多联系、多发展,举一反三,从比较中更深入地理解动态规划的思想。
[ 此贴被caithagoras在2006-11-16 19:27重新编辑 ]