【LeetCode】09动态规划Part01

【LeetCode】09动态规划Part01 509.斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划解题步骤

  1. 确定dp数组

  2. 递推公式

  3. dp数组的初始化

  4. 确定遍历顺序

  5. 打印dp数组(Debug)

509. 斐波那契数

题目链接:https://leetcode.cn/problems/fibonacci-number/description/

思路

  1. 确定dp数组

    dp[i]是前两项之和

  2. 递推公式

    dp[i] = dp[i - 1] + dp[i - 2]

  3. dp数组的初始化

    dp[0] = 0
    dp[1] = 1
    dp[i] = 0

  4. 确定遍历顺序

    顺序遍历

  5. 打印dp数组(Debug)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int fib(int n) {
if (n < 2) {
return n;
}
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i < n + 1; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}

70. 爬楼梯

题目链接:https://leetcode.cn/problems/climbing-stairs/description/

思路

  1. 确定dp数组

    第i个台阶有dp[i]种方法可以上来

  2. 递推公式

    dp[i] = dp[i - 1] + dp[i - 2]

  3. dp数组的初始化

    dp[0] = 0

    dp[1] = 1

    dp[2] = 2

    dp[i] = 0

  4. 确定遍历顺序

    顺序遍历

  5. 打印dp数组(Debug)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
public int climbStairs(int n) {
if (n < 2) {
return n;
}
int []dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}

746. 使用最小花费爬楼梯

题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/description/

思路

这道题描述看的不是很懂,理解之后还是有点模糊这个递推公式,AC之后再看看题解。先判断是否是最后一次上台阶(站在最后一个台阶上是,选择一步还是两步)

  1. 确定dp数组

    第i个台阶最小花费为dp[i]

  2. 递推公式

    如果是最后一次上台阶:则dp[i] = min(dp[i - 1], cost[i] + dp[i - 2]);

    否则:dp[i] = cost[i] + min(dp[i - 1], dp[i - 2]);

  3. dp数组的初始化

    dp[0] = cost[0]

    dp[1] = cost[1]

  4. 确定遍历顺序

    顺序遍历

  5. 打印dp数组(Debug)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
public int minCostClimbingStairs(int[] cost) {
int[] dp = new int[cost.length];
dp[0] = cost[0];
dp[1] = cost[1];
if (cost.length == 2) {
return Math.min(dp[0], dp[1]);
}
for (int i = 2; i < dp.length; i++) {
if (i == dp.length - 1) {
dp[i] = Math.min(dp[i - 1], cost[i] + dp[i - 2]);
} else {
dp[i] = cost[i] + Math.min(dp[i - 1], dp[i - 2]);
}
}
return dp[dp.length - 1];
}
}

官方题解

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
vector<int> dp(n + 1);
dp[0] = dp[1] = 0;
for (int i = 2; i <= n; i++) {
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[n];
}
};

主要是对状态转移方程理解的不够透彻

dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);


【LeetCode】09动态规划Part01
https://promisewang.github.io/post/707fc7db.html
作者
Promise
发布于
2024年3月20日
许可协议