动态规划之钢条切割
已知一段钢条长度为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]