前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >每日一练:【动态规划算法】斐波那契数列模型之使用最小花费爬楼梯(easy)

每日一练:【动态规划算法】斐波那契数列模型之使用最小花费爬楼梯(easy)

作者头像
ZLRRLZ
发布2024-12-13 20:12:07
发布2024-12-13 20:12:07
10100
代码可运行
举报
文章被收录于专栏:C语言C语言
运行总次数:0
代码可运行

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

2. 题目描述

根据一般的思维,我们会认为本题中数组的最后一个位置是楼顶,但是根据第一个例子,如果最后一个位置是楼顶,花费最少应该为10,但是结果是15,因此本体中的楼顶指的是数组外的下一个位置。

动态规划算法对于一维数组来说,我们的思路是创建动态表dp,定义dp[i]的含义,然后根据含义去利用dp表之前或者之后的值去表示dp[i],对于本道题,两种思路,都可行,因此,本体两种方法都介绍一下。

3. 解法(动态规划)

解法一:

1. 状态表示:

我们根据题目要求,我们设dp[i]以i为结尾,跳到i台阶的最小花费

2. 状态转移方程:

我们现在要尝试根据dp[i]位置之前或之后的值去表示出dp[i]。

因为一次可以跳一阶或者两阶,所以跳到第i阶之前最近的状态,要么跳到i - 1,然后再支付cost[i - 1],向上跳到i;要么跳到i - 2,再支付cost[i - 2],跳到i。

那么基于上述两种情况,dp[i]就有两种取值,因为求最小,我们取两个之中最小的值。

那么 状态表示方程就是dp[i] = min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2])

3. 初始化:

我们初始化要保证不能出现越界的情况,对于上述方程,我们发现dp[0]、dp[1],取前两个值会越界,因此,我们根据题意初始化这两个值。

4. 填表顺序:

根据状态表示方程,我们要先知道dp[i - 1]、dp[i - 2],才能知道dp[i],填dp表顺序是从左往右。

5. 返回值:

返回到达楼顶的最小花费,即dp[n].

算法代码:
代码语言:javascript
代码运行次数:0
复制
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];
    }
};

解法二:

1. 状态表示:

我们设dp[i]的含义为从i出发,到达楼顶的最小花费。

2. 状态转移方程:

那么此时的最近状态是,从i出发支付第i阶的费用,然后向后跳一阶到达i + 1,或者向后跳两阶到达i + 2。

那么求从i出发到楼顶的最小花费,就是当前i阶的花费加上从i + 1出发 的最小花费或从i + 2出发的最小花费,即状态表示方程是dp[i] = cost[i] + min(dp[i + 1], dp[i + 2]);

3. 初始化:

当前状况下的边界情况,我们发现从n - 2往后跳两步或者从n - 1出发往后跳一步,就会到达楼顶,这时我们仅需要支付cost[n - 2]和cost[n - 1]的费用, 即dp[n - 2] = cost[n - 2],dp[n - 1] = cost[n - 1]。

4. 填表顺序:

此时我们需要知道dp[i]位置值,我们需要先知道dp[i + 1]、dp[i + 2],因此填表顺序是从右往左。

5. 返回值:

由题意知,我们可以从0阶或者1阶出发,因此为此时dp[0]表示从0出发到达楼顶的最小花费,dp[1]表示从1出发到达楼顶的最小花费,因此,我们取两者之间的最小值返回。

算法代码:
代码语言:javascript
代码运行次数:0
复制
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n = cost.size();
        vector<int> dp(n);
        dp[n - 2] = cost[n - 2];
        dp[n - 1] = cost[n - 1];
        for(int i = n - 3; i >= 0;i--)
        {
            dp[i] = cost[i] + min(dp[i + 1], dp[i + 2]);
        }

        return min(dp[0],dp[1]);
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目链接:746. 使用最小花费爬楼梯
  • 2. 题目描述
  • 3. 解法(动态规划)
    • 解法一:
      • 1. 状态表示:
      • 2. 状态转移方程:
      • 3. 初始化:
      • 4. 填表顺序:
      • 5. 返回值:
      • 算法代码:
    • 解法二:
      • 1. 状态表示:
      • 2. 状态转移方程:
      • 3. 初始化:
      • 4. 填表顺序:
      • 5. 返回值:
      • 算法代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档