一. 动态规划(dynamic programming):
- 动态规划与分治方法相似,都是通过组合子问题的解来求解原问题。
- 动态规划方法常用来求解最优化问题(optimization problem)。
二. 动态规划与分治方法的区别(difference):
- 分治方法将问题划分成互不相交的子问题,递归的求解子问题,组合子问题解,求出原问题的解。
- 动态规划用于子问题重叠情况。
三. 动态规划步骤:
- 刻画最优解结构特征。
- 递归地定义最优解的值。
- 计算最优解的值,通常采用自下向上(打表)的方法,还有自下向上(记忆化)的方法。
- 利用计算出的信息构造一个最优解(获得最优值的解,这种解可以有很多)。
四. 举例:
钢条切割问题:给定一段长度为 n 英寸的钢条和一个价格表 pi (i = 1, 2, …, n),求切割方案,使得销售收益 rn 最大。
长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
价格pi | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |
将 n 英寸切割为 k 段(1<= k <= n)的最优方案:
{n=i1+i2+...+ikrn=pi1+pi2+...pik
{
n
=
i
1
+
i
2
+
.
.
.
+
i
k
r
n
=
p
i
1
+
p
i
2
+
.
.
.
p
i
k
针对上述表格,最优收益值如下:
收益 | 切割方案 |
---|---|
r1 = 1 | 1 = 1 |
r2 = 5 | 2 = 2 |
r3 = 8 | 3 = 3 |
r4 = 10 | 4 = 2 + 2 |
r5 = 13 | 5 = 2 + 3 |
r6 = 17 | 6 = 6 |
r7 = 18 | 7 = 1 + 6 or 7 = 2 + 2 + 3 |
r8 = 22 | 8 = 2 + 6 |
r9 = 25 | 9 = 3 + 6 |
r10 = 30 | 10 = 10 |
更一般的,对于 rn (n >= 1), 我们可以用更更短的钢条的最优切割收益来描述它:
rn=max(pn,r1+rn−1,r2+rn−2,...,rn−1+r1)
r
n
=
m
a
x
(
p
n
,
r
1
+
r
n
−
1
,
r
2
+
r
n
−
2
,
.
.
.
,
r
n
−
1
+
r
1
)
上面 pn 对应不切割的切割方案,其他为另外切割的方案。
MEMOIZED-CUT-ROD-AUX(p,n,r)
if r[n] >= 0
return r[n];
if n == 0
q = 0;
else
q = NaN;
for i = 1 to n
q = max(q,p[i]+MEMOIZED-CUT-ROD-AUX(p,n-i,r));
r[n]=q;
return q;
参考文献
- Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest,等. 算法导论(原书第3版 )[J]. 计算机教育, 2013(12):51-51.