【LeetCode】09动态规划Part01 509.斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
动态规划解题步骤
确定dp数组
递推公式
dp数组的初始化
确定遍历顺序
打印dp数组(Debug)
509. 斐波那契数
题目链接:https://leetcode.cn/problems/fibonacci-number/description/
思路
确定dp数组
dp[i]
是前两项之和
递推公式
dp[i] = dp[i - 1] + dp[i - 2]
dp数组的初始化
dp[0] = 0
dp[1] = 1
dp[i] = 0
确定遍历顺序
顺序遍历
打印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/
思路
确定dp数组
第i个台阶有dp[i]种方法可以上来
递推公式
dp[i] = dp[i - 1] + dp[i - 2]
dp数组的初始化
dp[0] = 0
dp[1] = 1
dp[2] = 2
dp[i] = 0
确定遍历顺序
顺序遍历
打印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之后再看看题解。先判断是否是最后一次上台阶(站在最后一个台阶上是,选择一步还是两步)
确定dp数组
第i个台阶最小花费为dp[i]
递推公式
如果是最后一次上台阶:则dp[i] = min(dp[i - 1], cost[i] + dp[i - 2]);
否则:dp[i] = cost[i] + min(dp[i - 1], dp[i - 2]);
dp数组的初始化
dp[0] = cost[0]
dp[1] = cost[1]
确定遍历顺序
顺序遍历
打印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]);