最优化问题,即要做出一组选择以达到一个最优解。在做选择的同时,经常出现同样形式的子问题。当某一特定子问题可能出自多于一种选择的集合时,动态规划就很有效。关键技术是存储这些子问题的每一个解,以备它重复出现。
与分治法不同的是,动态规划面对的子问题并不是相互独立的,各子问题有可能包含公共的子子问题。
1)描述最优解的结构
2)递归定义最优解的值
3)按自底向上的方式计算最优解的值。
4)由计算出的结果构造一个最优解。
- 子问题重叠
- 最优子结构
1 装配线调度问题
给出两条装配线,每条n个装配站,装配时间都不相同,如果要把装配到一半的移到另外一条线上需要时间代价t。
问最短装配时间和最短装配路径。
步骤1:通过工厂最快路线的结构
对两条装配线的任一条来说:一条通过j站的最短路径,必然通过j-1站或是另一条线的j-1站加上转线代价。所以就分解成了两个子问题的最优解问题。
步骤2:一个递归的解
首先找到起始位置,也就是底,
f1[1] = e1 + a1,1
f2[1] = e2 + a2,1
f1[j] = min(f1[j-1] + a1,j , f2[j-1] + t2,j-1 + a1,j)
f2[j] = min(f2[j-1] + a2,j , f1[j-1] + t1,j-1 + a2,j)
而f* = min(f1[n] + x1, f2[n] + x2)