一维动态规划基础
本章是动态规划算法的基础入门篇,通过三道简单题 + 一道中等难度的一维动态规划题带你初识动态规划,了解其基本写法。
动态规划核心概念
通过大量练习可总结动态规划做题步骤。简单来说,动态规划理解为:某种状态的公式 + 提前求出来值的容器,求出当前位置的值然后放到容器中供后续使用。因为初始值通常是可见的,从而启动动态规划。
主要提炼出以下要素:
- 状态
- 容器的重要性
- 公式(即状态转移方程)
严格来说:动态规划 = 状态定义 + 状态转移方程 + 初始条件 + 状态存储(容器)
动规基本步骤
- 状态表示:就是 dp 表(容器一般是数组)中里面的
dp[i]值的含义。- 通过经验 + 题目要求:通常为'以 i 位置结尾'或类似描述。
- 分析问题的过程中,发现相同的子问题。
- 状态转移方程:本质就是
dp[i] = ?(也是最难的一步)。- 通过状态表示再结合题目含义推导出
dp[i]的值到底为多少。
- 通过状态表示再结合题目含义推导出
- 初始化:
- 保证填表的时候不越界。
- 主要也是根据题目进行。
- 填表顺序:
- 为了保证填写当前状态的时候前面状态已经存到容器中,这样才能进行计算。
- 一般是从左向右/从上到下。
- 返回值:
- 通过最终得到的 dp 表和题意找到 dp 表中的结果。
附注:状态表示通常为'以 i 位置结尾/开头'。dp[i] 通常通过最后一个状态来进行分析。初始化通常通过第一个状态来进行分析。再做类似数字判断时,不要使用字符来简单的判断,而是将数字字符根据位数转变为真正的数字然后再进行判断。适当的需要的情况下可以开辟空间来处理边界问题。
具体训练
1. 第 N 个泰波那契数
题目
LeetCode: 第 N 个泰波那契数
分析题目并提出解决方法
回顾五大步骤:
- 状态表示:就是 dp 表中里面的值的含义。
- 状态转移方程:本质就是
dp[i]等于什么。 - 初始化:保证填表的时候不越界。
- 填表顺序:为了填写当前状态的时候,所需要的状态已经计算过了。
- 返回值:题目要求 + 状态表示。
题解核心逻辑
- 状态表述:
dp[i]:第 i 个泰波那契数。 - 本题的转移方程:
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]。 - 填表顺序:需要在求第 i 位置,那么
i-1、i-2、i-3三个位置的值都得算好。从左向右。 - :题目要求:第 n 个的值 即可。


