动态规划(DP)笔记(一): 简介


基本术语:

  • 阶段:将求解问题的过程分为若干个相互联系的阶段

  • 状态:状态表示每个阶段开始棉铃的自然状况和客观条件

  • 决策:从当前状态转移至下一状态

  • 策略:一系列决策的组合

  • 边界:初始集合

  1. 状态设计:

    1.1 阶段划分:将原问题划分为若干个不相交的部分,每部分称为一个阶段。

    1.2 状态设计:设计信息来描述当前阶段的各个不同情况,这些不同的情况称为状态,信息则是状态的表示。

  2. 决策:决策是从当前状态转移至不同的状态,决策与状态构成一个有向无环图(DAG)


动态规划的性质:

  • 最优子结构:一个最优化的策略,其子策略总是最优的,反过来也可以通过最优子策略推出最优策略。

  • 无后效性:当前决策只与当前状态有关,与之前的决策无关。

  • 子问题重叠:算法在计算过程中会反复求解一定量的相同的子问题,而不是不断生成新的子问题。也就是说子问题空间不大,或者是状态空间不大,可以通过存储状态的答案加速计算过程。


动态规划题目特点:

  • 最值

  • 计数

  • 存在性判定(相当于计数是否大于0)


动态规划的实现方式:

  • 记忆化搜索:记忆化搜索是比较简单的实现方式,通过数组存储不同状态的答案,当搜索某一状态时,若已经计算过就直接返回,否则向下搜索并存储计算到的答案。

    优点:
    · 能避免无用状态答案的计算
    · 边界问题易于考虑
    · 易于思考,无需考虑状态的计算顺序
    · 可以使用搜索算法的优化技巧

  • 递推:利用 for 循环进行状态的枚举更新,需要推导状态转移方程。

    优点:
    · 可以加入动态规划优化
    · 没有记忆搜索的递归栈开销,速度快


解决步骤小结:

  1. 确定状态表示,包含阶段划分和状态表示
  2. 写出转移方程
  3. 确定边界:初始的情况
  4. 如果使用递推,需要考虑状态枚举的顺序

参考

动态规划 – Introduction
本文是基于该博客的笔记,更详细的内容可以在上述链接查看。
这位博主的B站也有配套的视频讲解,我是觉得讲得特好!

猜你喜欢

转载自www.cnblogs.com/joe-w/p/12323041.html
今日推荐