题目描述
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。
注意:楼梯顶部不是 cost 数组里的台阶,是数组末尾之后的位置。例如 cost 长度为 n,要走到 n 的位置才算登顶。
示例: 输入:cost = [10,15,20] 输出:15 解释:从下标 1 开始,付 15,直接跨两步到达楼顶。
动态规划五部曲分析
做动态规划题目,固定 5 步思考:dp 数组含义、递推公式、初始化、遍历顺序、结果返回。
1. dp 数组定义
dp[i]:到达第 i 阶台阶,所需要的最小花费。
i 的范围:
0 ~ n,n = cost.size(),dp[n]代表到达楼顶。
2. 状态转移公式
想要到达第i位置,只有两种来源:
- 从
i‑1台阶爬上来:到达i‑1的花费dp[i‑1]+ 登上i‑1台阶要付的钱cost[i‑1] - 从
i‑2台阶爬上来:到达i‑2的花费dp[i‑2]+ 登上i‑2台阶要付的钱cost[i‑2]
取得两者的最小值即可
3. dp 数组初始化
题目允许起点选 0 或者 1 台阶,站在 0、1 台阶本身不需要花钱,花钱是离开这个台阶往上走的时
4. 遍历顺序
每一个dp[i]依赖前面dp[i‑1]、dp[i‑2],所以从左到右循环,i 从 2 一直到 n。
5. 返回结果
楼顶是第 n 位置,返回dp[n]。
cpp
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
// 定义dp数组,dp推到公式,初始化,从左往右填,返回值
int n=cost.size();
vector<int>dp(n+1);
dp[0]=0;
dp[1]=0;
for(int i=2;i<n+1;i++)
{
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[n];
}
};
候。