DP Summary

DP definition from wiki:

动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。

通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

适用情况

  1. 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
  2. 无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
  3. 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

动态规划,本质上是记忆化搜索,以解决重复计算的搜索。其实现方式:

1. 记忆化搜索
2. 循环

对于适合动态规划来进行题解的题目

  1. 首先要思考 Naive solution,这是对问题本身的基本理解。It often comes with Recursion
  2. 判断需要重复计算的子问题
  3. 寻找DP优化方案

DP 的题解步骤为:

  1. 确定状态定义
  2. 确定状态转移方程
  3. DP状态初始化
  4. 循环体迭代
  5. 返回 target

九章算法对DP的描述:

什么样的题目适合动态规划?如何想到使用DP?

  1. One of the following three
    a) Maximum/Minimum
    b) Yes/No
    c) Count(*)
  2. Can not sort / swap
    example, not for DP

动态规划的4点要素

  1. 状态 State 灵感,创造力,存储小规模问题的结果
  2. 方程 Function 状态之间的联系,怎么通过小的状态,来算大的状态
  3. 初始化 Intialization 最极限的小状态是什么, 起点
  4. 答案 Answer 最大的那个状态是什么,终点

面试最常见的四种类型

  1. Matrix DP (10%)
  2. Sequence (40%)
  3. Two Sequences DP (40%)
  4. Backpack (10%)

Matrix DP
state: f[x][y] 表示我从起点走到坐标x,y...... function: 研究走到x,y这个点之前的一步
initialize: 起点
answer: 终点


Sequence Dp
state: f[i]表示“前i”个位置/数字/字母,(以第i个为)... function: f[i] = f[j] ... j 是i之前的一个位置
intialize: f[0]..
answer: f[n-1]..


Two Sequences Dp
state: f[i][j]代表了第一个sequence的前i个数字 /字符 配上第二个sequence的前j个...
function: f[i][j] = 研究第i个和第j个的匹配关系 intialize: f[i][0] 和 f[0][i]
answer: f[s1.length()][s2.length()]

你可能感兴趣的:(DP Summary)