1、题目:使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
2、解题思路
动规五部曲
1、确定dp数组以及下标的含义,到达第i个台阶所花费的最少体力为dp[i]
2、确定递推公式,可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。选其中最小的,所以dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
3、dp数组如何初始化,看一下递归公式,dp[i]由dp[i-1],dp[i-2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。
vector<int> dp(cost.size());
dp[0] = cost[0];
dp[1] = cost[1];
4、确定遍历顺序,dp[i]又dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。
5、举例推导dp数组,cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下:
3、代码
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size());
dp[0] = cost[0];
dp[1] = cost[1];
for (int i = 2; i < cost.size(); i++) {
dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
}
// 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值
return min(dp[cost.size() - 1], dp[cost.size() - 2]);
}
};