Netherspite

理论基础

动态规划的特征

问题能抽象成多阶段决策最优解模型。有三个特征:

最优子结构

问题的最优解包含子问题的最优解。可以通过子问题的最优解,推导出问题的最优解。

无后效性

推导后面阶段的状态时,只关心前面阶段的状态值,不关心具体过程;某阶段状态确定后,就不受之后阶段的决策影响。

重复子问题

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

求解方法

状态转移表

状态转移表一般是二维的,每个状态包含行、列、数组值三个变量,根据决策的先后过程,从前往后,根据递推关系,分阶段填充状态表中的每个状态。

大致思路可以概括为:

回溯算法实现->定义状态->画递归树->找重复子问题->画状态转移表->根据递推关系填表->翻译成代码

状态转移方程

根据最优子结构,写出递归公式,也就是状态转移方程。

大致思路可以概括为:

找最优子结构->写状态转移方程->翻译成代码

常见算法比较

贪心、回溯、动态规划可以归为一类,都可以抽象成多阶段决策最优解模型。而分治算法解决的问题也是最优解问题,但往往不是多阶段决策模型。

回溯算法相当于穷举搜索,时间复杂度是指数级别。

分治算法分割成的子问题不能重复,而回溯算法存在大量重复子问题,动态规划就是解决重复子问题。

贪心算法是动态规划的特殊情况,他的第三个特征不是重复子问题而是贪心选择性,通过局部最优的选择产生全局的最优选择,每一阶段都选择当前最优的决策从而构成全局最优解。


参考链接

  1. 动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题

 评论