【Leetcode每日一题】 动态规划 - 使用最小花费爬楼梯(难度⭐)(41)

1. 题目解析

题目链接:746. 使用最小花费爬楼梯

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

一、设定状态表

为了解决这个问题,我们首先要明确一个“状态表”。这个状态表其实就是一个记录表,用来记录到达每一层楼时的最小花费。

我们设定dp[i]为到达第i层楼时的最小花费。注意,这里的dp[i]只表示到达第i层时的花费,并不包括在第i层本身需要支付的费用。

二、考虑状态转移

接下来,我们要思考如何从一层楼到达另一层楼,并计算出最小花费。

  1. 从第i-1层上来:如果我们从第i-1层爬上来,那么到达第i层的总花费就是dp[i-1] + cost[i-1],其中cost[i-1]是第i-1层的费用。

  2. 从第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

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

最近更新

  1. TCP协议是安全的吗?

    2024-03-24 19:28:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-24 19:28:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-24 19:28:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-24 19:28:03       18 阅读

热门阅读

  1. uniapp离线打包笔记

    2024-03-24 19:28:03       17 阅读
  2. 单元测试框架 Junit

    2024-03-24 19:28:03       19 阅读
  3. 算法刷题记录 Day25

    2024-03-24 19:28:03       16 阅读
  4. 条件约束聚类并显示

    2024-03-24 19:28:03       15 阅读
  5. 若依实现多数据源

    2024-03-24 19:28:03       18 阅读