15 动态规划

动态规划与分治法的比较:

  1. 相同点:都是递归地求解子问题,然后将它们的解组合起来,求出原问题的解。
  2. 不同:分治法划分的子问题不应该有重叠的情况。而动态规划适用于这种情况,它对每个子子问题只求解一次,然后将其保存在一个表格中,从而无需每次求解一个子子问题时都重新计算。
  3. 动态规划通常用来求一个最优解的问题,这种问题通常有很多可行解。

动态规划有两种等价的实现方法:

  1. 带备忘录的自顶向下法:按自然的递归形式编写过程,但过程中会保存每个子问题的解(通常保存在一个数组散列表中)。当需要一个子问题的解时,将首先检查是否已经保存过此解。如果是,将直接返回保存的值。否则,按通常方式求解这个子问题。
  2. 自底向上法:需要恰当定义子问题的“规模”的概念,以使任何子问题的求解都只依赖于“更小”的子问题的求解。我们先求解规模小的子问题。在求解一个问题时,它所依赖的那些规模更小的子问题已经求解出了,求解完后,会保存这个自问题的解。

比较:第二种方法由于没有真正递归地考察到所有可能的子问题,而且没有频繁的递归函数调用的开销。所以第二种方法在时间复杂度上会有更小的系数。所以,我们通常使用第二种方法。


最优子结构: 问题的最优解是由相关子问题的最优解组合而成,而这些子问题可以独立求解。


何时使用动态规划求解:
待求解问题必须具备两个要素: 
1. 最优子结构(当然,具备此条件,意味着此问题也可能适合用贪心算法)
2. 子问题重叠
  


实例:
15.1 钢条切割

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值