动态规划之钢条切割
已知一段钢条长度为n,切割后每段长度卖出的价格i--pi,如下列表格,求最优的切割方案
长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
价格pi | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |
如果一个最优解将钢条切割成k段,则n = i1 + i2 + ... + ik;
BOTTOM-UP-CUT-ROD(p,n)
let r[0..n] be a new array
r[0] = 0 //钢条长度为零,最优解为0
for i = 1 to n //钢条长度从1增长到n,依次求最优解
q = -∞ //初始化该钢条长度最优解
for j = 1 to i //依次切割第j个位置
q = max(q, p[j] + r[i-j]) //
r[i] = q //保存子结构
return r[n]
习题15.1-3增加每次切割要付出固定成本c
则在对一个长度为i的钢条,初始p = r[i]; pj = max(p, p[j] + r[i-j] - c) (j = 1,2,3,...,i-1),对上述代码修改得
BOTTOM-UP-CUT-ROD_C(p,n,c)
let r[0..n] be a new array
r[0] = 0 //钢条长度为零,最优解为0
for i = 1 to n //钢条长度从1增长到n,依次求最优解
q = p[i] //初始化该钢条长度最优解
for j = 1 to i-1 //依次切割第j个位置
q = max(q, p[j] + r[i-j] - c) //
r[i] = q //保存子结构
return r[n]
习题15.1-5斐波那契数列动态规划求解
数列 T(0) = 0 ; T(1) = 1; T(n) = T(n-1) + T(n-2);(n>=2)
设r[n]存储最优子结构
FBLQ_ARRAY(n)
let r[0..n] be a new array
r[0] = 0
r[1] = 1
for i = 2 to n
r[i] = r[i-1] + r[i-2]
return r[n]