动态规划 Leetcode 746 使用最小花费爬楼梯
使用最小花费爬楼梯
Leetcode 746
学习记录自代码随想录
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。
示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。
提示:
2 <= cost.length <= 1000
0 <= cost[i] <= 999
要点:1.需要想出递推公式: d p [ i ] = m i n ( d p [ i − 1 ] + c o s t [ i − 1 ] , d p [ i − 2 ] + c o s t [ i − 2 ] ) dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]) dp[i]=min(dp[i−1]+cost[i−1],dp[i−2]+cost[i−2])
方法一:dp数组用vector表示
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {if(cost.size() <= 2) return min(cost[0], cost[1]);int n = cost.size();// 1.dp数组含义,爬到第i个台阶所需支付的费用(此处并不算第i阶台阶的花费),爬到顶层是总台阶数加1vector<int> dp(n+1);// 2.递推公式 dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);// 3.初始化dp[0] = 0;dp[1] = 0;// 4.遍历顺序,从前向后for(int i = 2; i < n+1; i++){dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);}// 5.举例推导 eg.对[10,15,20]得dp数组为0,0,10,15,返回末尾15return dp[n];}
};
方法二:简化dp数组标志,用两个变量迭代变化,减少空间复杂度
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {if(cost.size() <= 2) return min(cost[0], cost[1]);int n = cost.size();// 1.dp数组含义,爬到第i个台阶所需支付的费用(此处并不算第i阶台阶的花费),爬到顶层是总台阶数加1// vector<int> dp(n+1);// 2.递推公式 dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);// 3.初始化int dp_1 = 0;int dp_2 = 0;// 4.遍历顺序,从前向后for(int i = 2; i < n+1; i++){int dp_temp = min(dp_1 + cost[i-1], dp_2 + cost[i-2]);dp_2 = dp_1;dp_1 = dp_temp;}// 5.举例推导 eg.对[10,15,20]得dp数组为0,0,10,15,返回末尾15return dp_1;}
};