参考《算法导论》动态规划章节。
判断一个问题能否用动态规划解决,要求问题满足两个条件:
1)存在最优子结构,即一个问题可以通过n(n>=1)个选择划分成n或n+1个同类子问题+选择代价;
2)存在重叠子问题,不同的问题会重复调用同一个子问题;
动态规划解决问题的步骤:
1)刻画一个最优解的结构特征,即寻找一个最优子结构;
2)一个递归求解方案;
3)计算最优解的值,两种方法:1.自底向上,寻找最优结构中递增的性质;2.自顶向下,使用类似深度优先搜索的方法,附加备忘的递归操作;
4)利用计算出的信息构造最优解,此时一般是构造一个辅助表记录每个子问题的最优解做的选择
自底向上,构造循环的算法,根据最优子结构所构造的递归解法的不同有不同的循环结构。
- 在“钢条切割”的问题中,最优子结构是1个选择1个子问题,直接从问题长度开始主序递增;
- 在“矩阵链乘法”问题中,最优子结构是1个选择2个子问题,子问题的长度在减小,则从问题的长度开始主序递增;
在
- 在“最长公共子序列”问题中,递归解法中c[i,j]只与他的前一行和当前行有关,则可用i为主序递增循环