代码随想录算法训练营第38天 | 动态规划理论基础 LeetCode509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
@代码随想录算法训练营第38天 | 动态规划 LeetCode509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
509. 斐波那契数
第一遍读题思考
确定dp[i]的含义,确定递推公式,如何初始化,确定遍历顺序。
代码随想录解法思路
。
c++代码具体实现注意事项
class Solution {
public:int fib(int n) {if(n<=1) return n;int dp[2];dp[0] = 1;dp[1] = 1;for(int i=2;i<n;i++){int sum = dp[0] + dp[1];dp[0] = dp[1];dp[1] = sum;}return dp[1];}
};
70. 爬楼梯
第一遍读题思考
确定dp[i]的含义,确定递推公式,如何初始化,确定遍历顺序。
代码随想录解法思路
dp[i]就用来表示爬上第i层台阶有几种方法,那么很显然,递推公式就是dp[i]=dp[i-1]+dp[i-2]。
c++代码具体实现注意事项
class Solution {
public:int climbStairs(int n) {int dp[3];dp[0] = 1;dp[1] = 1;if(n<=1) return 1;for(int i=2;i<=n;i++){dp[2] = dp[0]+dp[1];dp[0] = dp[1];dp[1] = dp[2];}return dp[2];}
};
746. 使用最小花费爬楼梯
第一遍读题思考
确定dp[i]的含义,确定递推公式,如何初始化,确定遍历顺序。
代码随想录解法思路
dp[i]就用来表示爬上第i层台阶所耗费的体力,初始化dp[0]和dp[1]等于0,因为爬上0和1台阶不需要消费体力。
那么爬上dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])。
c++代码具体实现注意事项
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int dp[3];dp[0] = 0;dp[1] = 0;for(int i=2;i<=cost.size();i++){dp[2] = min(dp[1]+cost[i-1], dp[0]+cost[i-2]);dp[0] = dp[1];dp[1] = dp[2];}return dp[2];}
};