算法笔记-动态规划02

什么样的问题适合动态规划解决

一个模型:动态规划解决的问题的模型是“多阶段决策最优解模型”。

动态规划一般用来解决最优问题。这个解决过程,需要经历多个决策阶段。每个决策阶段都对应一组状态,从每个决策阶段都选出一种合适的状态,组成一个决策序列,这个序列就是我们期望的最优解。

三个特征:

1:最优子结构。最优子结构指的是最优解包含子问题的最优解。也就是说,通过子问题的最优解,可以推导出问题的最优解。

2:无后效性。第一:再推导后续阶段的状态时,只关心上一个阶段的结果,并不关心上一个阶段结果的推导过程。第二:某阶段的状态一经确定,就不会受之后阶段的决策影响。

3:重复子问题。不同的决策序列,到达某个相同的阶段时,可能会产生重复的状态。

两种动态规划解题思路总结

1:状态转移表法

使用动态规划解决的问题,都可以使用回溯算法的暴力搜索解决。所以,遇到问题,先尝试用回溯算法解决,然后定义状态,状态对应节点,画出递归树。通过递归树,观察是否存在重复子问题,以及重复子问题是如何产生的,的出规律,判断是否用动态规划解决。

找到重复的子问题后,有两种处理方式:方式一,添加备忘录方法,避免重复子问题的求解。方式二,状态转移法,合并相同状态,只保留不同状态的解,减少结果集的指数型增长。

2:状态转移方程法

首先,分析某问题如何通过子问题递归求解,也就是所谓的最优子结构。根据最优子结构写出递归公式,也就是状态转移方程。根据状态转移方程,完成代码。代码的实现方式有两种:递归加备忘录,迭代递推。

注:状态转移方程法,理解的还不到位,暂时留做标记,日后复盘。

四种算法思想分析

贪心,分治,回溯和动态规划。

贪心,回溯和动态规划分为一类,这三种思想解决的问题都可以抽象成多阶段决策最优解模型。

分治归为一类,更偏向于复杂问题简单化,简单问题的解聚合成复杂问题的解。

回溯算法基本上可以解决动态规划以及贪心算法的问题。回溯算法相当于穷举搜索,然后对比得出最优解。时间复杂度高,指数级别的,适合解决小规模的数据。

动态规划比回溯算法效率高,但是对问题的要求有限制,必须满足三个特征。动态规划与分子算法中都包含子问题。动态规划中正是由于存在大量相同的子问题,所以效率才高。而分治算法中子问题是不允许有重复的。

贪心算法实际上是动态规划算法中的一种特殊情况。解决问题高效,代码实现更简单。它解决的问题也需要满足三个特征:最优子结构,无后效性,贪心选择性(通过局部最优的选择,能产生全局的最优选择)。

总结

本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。

初入算法学习,必是步履蹒跚,一路磕磕绊绊跌跌撞撞。看不懂别慌,也别忙着总结,先读五遍文章先,无他,唯手熟尔~
与诸君共勉

-------------本文结束感谢您的阅读-------------