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