这题与爬楼梯那题有些类似;
采用动态规划的方法,通过构建一个数组dp来存储每一步所需的最小花费。初始情况下,初始位置可以是0或1,所以dp[0]和dp[1]都被初始化为0。
然后,通过一个循环,从第3步开始计算每一步所需的最小花费。对于每一步i,dp[i]表示在第i步时的最小花费,它等于前一步(dp[i-1])和前两步(dp[i-2])中的较小值,再加上当前步的花费(cost[i-2],注意索引偏移)。这是因为在每一步,你可以选择从前一步直接跳到当前步,或者从前两步跳到当前步,取最小值来确定最小花费。
最后,返回达到顶层(最后一步)的最小花费,即dp数组的最后一个元素dp[cost.size()]。
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
// 创建一个整数数组dp,用于存储每一步所需的最小花费
int dp[cost.size() + 1];
// 初始化dp数组的前两个元素为0,因为初始位置可以是0或1
dp[0] = dp[1] = 0;
// 从第3步开始,计算每一步所需的最小花费
for (int i = 2; i <= cost.size(); i++) {
// dp[i]表示在第i步时的最小花费,它等于前一步和前两步中的较小值,
// 加上当前步的花费cost[i-2](注意索引偏移)
dp[i] = min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);
}
// 返回达到顶层的最小花费,即dp数组的最后一个元素dp[cost.size()]
return dp[cost.size()];
}
};