# 基础问题 ## [509. 斐波那契数](https://leetcode.cn/problems/fibonacci-number/) 1. `dp[i]` 是第 `i` 个斐波那契数的数值 2. `dp[i] = dp[i - 1] + dp[i - 2]` 3. `dp[0] = 0`, `dp[1] = 1` 4. 从前向后遍历 ## [70. 爬楼梯](https://leetcode.cn/problems/climbing-stairs/) 1. `dp[i]` 是爬到第 `i` 阶楼梯的方法数 2. `dp[i] = dp[i - 1] + dp[i - 2]` 3. `dp[1] = 1`, `dp[2] = 2`, `dp[0]` 不用管 4. 从前向后遍历 ## [746. 使用最小花费爬楼梯](https://leetcode.cn/problems/min-cost-climbing-stairs/) 1. `dp[i]` 是爬到第 `i` 阶的最小开销(假设 `i == 0` 代表第一个阶梯) 2. `dp[i] = min{dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]}` 3. `dp[0] = 0`, `dp[1] = 0` 4. 从前向后遍历 ## [62. 不同路径](https://leetcode.cn/problems/unique-paths/) 1. `dp[i][j]` 表示到 `(i, j)` 的位置有多少种路径(从 `(0, 0)` 出发) 2. `dp[i][j] = dp[i - 1][j] + dp[i][j - 1]` 3. `dp[i][0] = 1`, `dp[0][j] = 1` 4. 从前向后遍历 ## [63. 不同路径 II](https://leetcode.cn/problems/unique-paths-ii/) 1. `dp[i][j]` 表示到 `(i, j)` 的位置有多少种路径(从 `(0, 0)` 出发) 2. `dp[i][j] = if (isNotObstacle[i - 1][j]) dp[i - 1][j] + if (isNotObstacle[i][j - 1]) dp[i][j - 1]` 3. 如果 `(i, 0)` 是障碍物,那么 `(0, 0)` 到 `(i - 1, 0)` 都初始化为 `1`,后面的初始化为 `0`。`(0, j)` 同理 4. 从前向后遍历