动态规划解题套路框架

🔖软件开发 

动态规划三要素

  • 重叠子问题:使用备忘录来优化穷举过程,避免不必要的计算

  • 最优子结构:通过子问题的最值得到原问题的最值

  • 状态转移方程

斐波那契数列

0和1开始,之后每一项都等于前两项之和: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……

状态转移方程
\[f(n)= \begin{cases} 1, n=1或2\\ f(n-1)+f(n-2) \end{cases}\]

凑零钱问题

给你 k 种面值的硬币,面值分别为 c1, c2 … ck ,每种硬币的数量无限,再给一个总金额 amount ,问你最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1 。

最优子结构

因为硬币的数量是没有限制的,所以子问题之间没有相互制,是互相独立的。

状态转移方程
\[dp(n)= \begin{cases} 0, n=0\\ -1, n<0\\ min \lbrace dp(n - coin) + 1 | coin \in coins \rbrace, n>0 \end{cases}\]
  • base caseamount 为 0 时算法返回 0
  • 状态:原问题和子问题中会变化的变量,即amount
  • 选择:导致状态产生变化的行为,所有硬币的面值就是你的选择
  • dp函数
    • 自顶向下:递归函数
    • 自底向上:数组迭代

阅读原文