分治技术的问题:
子问题相互独立
如果子问题不是相互独立的,分治方法将重 复计算公共子问题,效率很低
例如计算斐波那契数列的第n项
– F(0)=F(1)=1
– F(n)=F(n-1)+F(n-2)
提高效率的方法
从规模最小的子问题开始计算
用恰当数据结构存储子问题的解,供以后查询
确保每个子问题只求解一次
斐波那契算法:
算法F(n)
输入:非负整数n
输出:斐波那契数列第n项
1.A[0]=1; A[1]=1;
2. For i=2 To n
3. A[i]=A[i-1]+A[i-2];
4. 输出A[n];
动态规划算法特点
把原始问题划分成一系列子问题
求解每个子问题仅一次,并将其结果保存在 一个表中,以后用到时直接存取,不重复计算,节省计算时间
自底向上地计算
适用范围
一类优化问题:可分为多个相关子问题,子问题的解被重复使用
动态规划算法的设计步骤
分析优化解的结构
递归地定义最优解的代价
自底向上地计算优化解的代价保存之, 并获取构造最优解的信息
根据构造最优解的信息构造优化解