动态规划(DP)笔记(一): 简介
动态规划的性质:
-
最优子结构:一个最优化的策略,其子策略总是最优的,反过来也可以通过最优子策略推出最优策略。
-
无后效性:当前决策只与当前状态有关,与之前的决策无关。
-
子问题重叠:算法在计算过程中会反复求解一定量的相同的子问题,而不是不断生成新的子问题。也就是说子问题空间不大,或者是状态空间不大,可以通过存储状态的答案加速计算过程。
动态规划题目特点:
-
最值
-
计数
-
存在性判定(相当于计数是否大于0)
动态规划的实现方式:
-
记忆化搜索:记忆化搜索是比较简单的实现方式,通过数组存储不同状态的答案,当搜索某一状态时,若已经计算过就直接返回,否则向下搜索并存储计算到的答案。
优点:
· 能避免无用状态答案的计算
· 边界问题易于考虑
· 易于思考,无需考虑状态的计算顺序
· 可以使用搜索算法的优化技巧 -
递推:利用 for 循环进行状态的枚举更新,需要推导状态转移方程。
优点:
· 可以加入动态规划优化
· 没有记忆搜索的递归栈开销,速度快
解决步骤小结:
- 确定状态表示,包含阶段划分和状态表示
- 写出转移方程
- 确定边界:初始的情况
- 如果使用递推,需要考虑状态枚举的顺序
参考
动态规划 – Introduction
本文是基于该博客的笔记,更详细的内容可以在上述链接查看。
这位博主的B站也有配套的视频讲解,我是觉得讲得特好!