算法设计与分析--动态规划
Why?为什么用动态规划
分治技术的问题:
子问题是相互独立的
如果子问题不是相互独立的,分治算法将重复计算公共子空间,效率很低
提高效率的方法:
从规模最小的子问题开始计算
用恰当数据结构存储子问题的解,供以后查询
确保每个子问题只求解一次
优化问题:
给定一组约束条件和一个代价函数,在解空间中搜索具有最小或最大代价的优化解
很多优化问题可分为多个子问题,子问题相互关联,子问题的解被重复使用
What?什么是动态规划
动态规划算法特点
把原始问题划分成一系列子问题
求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复计算,节省计算时间
自底向上地计算
适用范围:
一类优化问题:可分为多个相关子问题,子问题的解被重复使用
How?怎么做动态规划
使用Dynamic Programming的条件
Optimal substructure(优化子结构)
当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有优化子结构
缩小子问题集合,只需那些优化问题中包含的子问题,减低实现复杂性
优化子结构使我们能自下而上地完成求解过程
Subteties(重复子问题)
在问题的求解过程中,很多子问题的解将被多次使用
动态规划算法的设计步骤
分析优化解的结构
递归的定义最优解的代价
自底向上的计算优化解的代价保存之,并获取构造最优解的信息
根据构造最优解的信息构造优化解
Longest Common Subsequence
问题的定义
子序列:X=(A,B,C,B,D,B),Z=(B,C,D,B)是X的子序列,W=(B,D,A)不是X的子序列。
公共子序列:Z是序列X与序列Y的公共子序列如果Z是X的子序列也是Y的子序列。
最长公共子序列(LCS)问题:
输入:X=(x1,x2,...,xn),Y=(y1,y2,...,ym)
输出:Z=X与Y的最长公共子序列
分析优化解的结构
有优化子结构,子问题有重叠性,采用动态规划。
建立LCS长度的递归方程
自底向上计算LCS的长度
构造优化解