赞
踩
动态规划常常与分治策略、贪心算法同时提及,三种算法都是通过组合子问题的解来求解原问题。在解决某些问题时,其子问题有大量的重叠情况,此时单纯使用分治策略会发现随着输入数据量的增大,运行时间呈指数级增长。动态规划是一种典型的用空间换时间的权衡策略。其核心思想就是将那些重复的子问题的解,记录下来,当需要再次相同子问题时,查表获取结果即可。动态规划通常用来求解最优化问题,适用问题通常有以下两个特点:1.具有最优子结构性质:问题的最优解由相关子问题的最优解组合而成。2.有大量的重叠子问题。二、钢条切割问题问题:Serling公司购买长钢条,将其切割为短钢条出售。假设切割工序没有成本,不同长度的钢条的售价如下:
问题分析:考虑 n = 4 的情况,那么有以下几种切割方式:
1.切割为四段,长度为:1,1,1,1;总共卖41=4元。
2.切割为三段,长度为:1,1,2;总共卖21+15=7元。
3.切割为两段,长度为:1,3;总共卖11+18=9元。
4.切割为两段,长度为:2,2;总共卖25=10元。
5.不切割,长度为:4;总共卖1*9=9元。
更一般的,对于r(n),我吗可以利用更短的钢条的最优化切割收益来描述它:
r(n)=max{p(n),r(1)+r(n-1),r(2)+r(n-2),…,r(n-1)+r(1)}
p(n)对应不切割,直接出售长度为n英寸的钢条,其他n-1个参数对应另外n-1种方案:对每个i=1,2…n-1,首先将钢条提起过为长度i和n-i的两段,接着求解这两段的最优收益r(i)和r(n-i)(每种方案的最优收益为两段的最优收益之和)。由于无法预知哪种方案会获得最优收益,我们必须考察所有可能i,选取其中收益最大者。如果直接出售最大,我们就不做任何切割。
伪代码如下
infinity = 1e+16 #无穷大
CUT-ROD(p, n)
if n == 0
return 0
q = -infinity
for i = 1 to n
q = max(q, p[i] + CUT-ROD(p, n-i))
return q
(重复计算问题)
伪代码如下
infinity = 1e+16 #无穷大
MEMOIZED-CUT-ROD(p, n)
let r[0..n] be a new array
for i = 0 to n
r[i] = -infinity
return MEMOIZED-CUT-ROD-AUX(p, n
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。