动态规划初识

来源:互联网 发布:九寨沟 几月 知乎 编辑:程序博客网 时间:2024/04/24 07:48

        首先,这是大学生涯第一篇博文。

        想要学习动态规划的同学,推荐一篇入门级且极具趣味的一篇博客

      【通过金矿模型介绍动态规划】,该文略长,但是通俗易懂,终于解决了之前我在看书中的几个疑虑:

      (1)如果全递归,那么它的效率体现在哪?

      (2)什么情况下使用动态递归?

      先帖上地址:【通过金矿模型介绍动态规划】

 

      建议先看完这篇不错的博客再看着两个问题以及思考。

      对于第一个问题,由于动态规划是由母问题衍生子问题,体现了分治思想,但同时在子问题中事实上包含了大量的重复解,那么突破效率的关键点就在于,将先遍历过的解尝试放在一个空间内(比如数组),然后在探索过程中先行检查所要的答案是不是已经在这个空间了?如果是,则直接取出避免重复递归;若不是,则继续我们的递归。

      对于第二个问题,作者给出了六个维度,如果遇到的问题满足下面所写的其中四点以上,那么可以用动态规划来解决:

① 最优子结构

      通过子问题的优化可以达到母问题的优化,达到这样效果的子结构我们称为最优子结构。

② 子问题重叠

      事实上,每个子问题都在面临同样的问题,而每个问题其实都包含了一些共同的问题和选择,那么这些选择就称为子问题重叠。

③ 边界

      既然使用了递归,熟悉递归的同学都知道一定要有边界,否则就是无限循环,所以定义边界是问题的终止点。

④ 子问题独立

      母问题在面对子问题选择时,当前被选择的两个或N个子问题不被互相干扰时候,我们称之为子问题独立。

⑤ 做备忘录

       每个子问题求解出来的结果被保存在备忘录(在上述所说的数组中),以便下一个递归时优先查找该备忘录。若没有这项,动态规划的时间效率没有丝毫提高!

⑥ 时间分析

      这块算法知识还需要提高,目前还有一个疑问就是,动态规划针对每个节点超过2个的情况同样适用么?它和树结构有什么区别?算法入门中,等到想清楚了再来更新。欢迎大家讨论~

原创粉丝点击