1. 题目解析
题目链接:746. 使用最小花费爬楼梯
这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。
2.算法原理
一、设定状态表
为了解决这个问题,我们首先要明确一个“状态表”。这个状态表其实就是一个记录表,用来记录到达每一层楼时的最小花费。
我们设定dp[i]
为到达第i
层楼时的最小花费。注意,这里的dp[i]
只表示到达第i
层时的花费,并不包括在第i
层本身需要支付的费用。
二、考虑状态转移
接下来,我们要思考如何从一层楼到达另一层楼,并计算出最小花费。
-
从第
i-1
层上来:如果我们从第i-1
层爬上来,那么到达第i
层的总花费就是dp[i-1] + cost[i-1]
,其中cost[i-1]
是第i-1
层的费用。 -
从第
i-2
层上来:另一种可能的情况是我们从第i-2
层直接跳到第i
层(假设有这样的跳跃能力)。那么到达第i
层的总花费就是dp[i-2] + cost[i-2]
。
我们需要比较这两种情况,选择花费更小的那种方式。
三、初始化状态
在开始计算之前,我们需要给状态表一个起点。显然,站在第一层或第二层是不需要花费的,所以dp[0] = dp[1] = 0
。
四、填表顺序
按照我们前面讨论的状态转移过程,我们需要从左往右依次计算每一层的最小花费,直到最后一层。
五、得出结果
最后,当我们填满整个状态表后,dp[n]
就代表了到达最顶层的最小花费,这就是我们要求的答案。
3.代码编写
class Solution
{
public:
int minCostClimbingStairs(vector<int>& cost)
{
int n = cost.size();
vector<int> dp(n + 1);
for(int i = 2; i <= n; i++)
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2]+ cost[i - 2]);
return dp[n];
}
};
The Last
嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。
觉得有点收获的话,不妨给我点个赞吧!
如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~