IX. Dynamic Programming

动态规划的本质是记忆化搜索,自上而下,每次搜索只记录一个值,已经计算过的值不再重复计算。一般不使用recursive,而是使用iterative.

Advantage:

Easy to think and implement.

Disadvantage:

Expensive memory to cost. Has to record all points.

让搜索的时候带一个值,这个值是从当前点出发最优解。

也可自底而上,从最底层开始初始化记录,然后再从倒数第二层来按照题目意思计算记录,直到计算出所有的记录。

Three common types of DP:

  1. Matrix DP

  2. Sequence DP (通常会多开一位,将0位空出来初始化,这样后面的元素才有依据)

  3. Two sequences DP

如果要求最优解、解的个数、直接判断True or False,一般用DP,因为DP就是用来解这种题

如果要求写出所有解,那么就是暴力搜索,DP做不出来

动态规划的要素总结:

  1. status:用什么DP来解决问题,并且代表什么含义

    • Matrix DP: f[i][j] 表示从(1,1)走到(i,j)

    • Sequence DP:f[i] 表示前 i 个 ……

    • Two-sequence DP: f[i][j] 表示前 i 个匹配上前 j 个……

    • Interval DP:f[i][j] 表示区间 i -> j ……

  2. transfer: 更新的判断条件

    • LCS: f[i][j] = max(f[i-1][j], f[i][j-1], f[i-1][j-1]+1)

    • LIS: f[i] = max(f[j]+1, a[i]>=a[j])

    • 分析最后一次cut/分析最后一个字符/分析最后……

  3. initialize:初始化第一个元素作为后续的基础

    • f[i][0], f[0][i]

    • f[0]

  4. answer:return值是什么

    • LIS:max{f[i]}

    • LCS: f[m][n]

  5. loop: 循环如何写

    • interval: 区间从小到大,先枚举区间的长度

Last updated

Was this helpful?