最小花费爬楼梯(动态规划)

这篇具有很好参考价值的文章主要介绍了最小花费爬楼梯(动态规划)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目:

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。

输入格式:
n 个整数,代表从第 n - 1 阶向上走的花费

示例 1:
输入:cost = [10, 15, 20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。
 
示例 2:
输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

提示:
2 <= cost.length <= 1000
0 <= cost[i] <= 999

思路和算法(动态规划):


        假设数组 cost 的长度为 n,则 n 个阶梯分别对应下标 0 到 n - 1,楼层顶部对应下标 n,问题等价于计算达到下标 n 的最小花费。可以通过动态规划求解。
        创建长度为 n + 1 的数组 minCost,其中 minCost[i] 表示达到下标 i 的最小花费。由于可以选择下标 0 或 1 作为初始阶梯,因此有 minCost[0] = minCost[1] = 0。
        当 2≤i≤n 时,可以从下标 i - 1 使用 cost[i−1] 的花费达到下标 i,或者从下标 i - 2 使用 cost[i−2] 的花费达到下标 i。为了使总花费最小,minCost[i] 应取上述两项的最小值,因此状态转移方程如下:


minCost[i] = min(minCost[i−1] + cost[i−1], minCost[i−2] + cost[i−2])


        依次计算 minCost 中的每一项的值,最终得到的 minCost[n] 即为达到楼层顶部的最小花费。

#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;

int minCostClimbingStairs(vector<int>& cost) {
    //int n = cost.size();
    //int* minCost = new int[n];
    //minCost[0] = minCost[1] = 0;
    //for (int i = 2; i <= n; i++)
    //{
    //    minCost[i] = min(minCost[i - 1] + cost[i - 1], minCost[i - 2] + cost[i - 2]);
    //}
    //return minCost[n];

    int n = cost.size();
    vector<int> minCost(n + 1);              //定义一个到达第 i 层台阶所需的最小花费容器
    minCost[0] = minCost[1] = 0;             //可从第0层和第1层开始,这两层不需要抵达所需花费
    for (int i = 2; i <= n; i++) {
        minCost[i] = min(minCost[i - 1] + cost[i - 1], minCost[i - 2] + cost[i - 2]);
    }
    return minCost[n];                       //返回到达最后一层的最小花费
}

int main() {
    int num;
    vector<int> cost;
    // cost 的长度始终比 i 大,除非输入回车否则输入不会停止(实现输入 n 个整数)
    for (int i = 0; i < cost.size() + 1; i++) {
        cin >> num;
        cost.push_back(num);                  // push.back() 函数,将数据放入 cost
        if (cin.get() == '\n')  break;        //当输入回车的时候退出循环
    }
    cout << minCostClimbingStairs(cost);
    return 0;
}

复杂度分析:
时间复杂度:O(n),其中 n 是数组 cost 的长度。需要依次计算每个 minCost 值,每个值的计算需要常数时间,因此总时间复杂度是 O(n)。
空间复杂度:O(1)。使用滚动数组的思想,只需要使用有限的额外空间。

作者:LeetCode - Solution
链接:https ://leetcode.cn/problems/min-cost-climbing-stairs/solution/shi-yong-zui-xiao-hua-fei-pa-lou-ti-by-l-ncf8/
来源:力扣(LeetCode)
 文章来源地址https://www.toymoban.com/news/detail-723426.html

到了这里,关于最小花费爬楼梯(动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划之使用最小花费爬楼梯

    题目链接选自力扣 : 使用最小花费爬楼梯 先根据示例 1 来理解一下题目的意思. 可以看到, 此时一共有两个起始位置 0 ,1. 并且这三个位置都对应了一定的费用 10, 15 当我们选择从某个地方开始想要向上走就得支付当前位置的费用才可以向上一格或者两格. 当前这个示例就是从

    2024年02月10日
    浏览(63)
  • LeetCode使用最小花费爬楼梯(动态规划)

    链接: 使用最小花费爬楼梯 题目描述 算法流程(方法一) 编程代码 优化代码 算法流程(方法二) 编程代码 代码优化

    2024年02月15日
    浏览(31)
  • 动态规划之使用最小花费爬楼梯【LeetCode】

    LCR 088. 使用最小花费爬楼梯 状态表示 ( 这是最重要的 ):dp[i]表示以第i级台阶为楼层顶部,到达第i层台阶的最低花费。 状态转移方程 ( 最难的 ): dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]); 初始化 :根据题意,我们需要知道到达第1层和第2层台阶的最低花费,第1层和第2层

    2024年03月16日
    浏览(41)
  • DAY42:动态规划(二)斐波那契数列+爬楼梯+最小花费爬楼梯

    斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: 给定 n ,请计算 F(n) 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 30 思路:动规五步 确定dp数组和数组下标含义 DP题目都需要定义一维

    2024年02月13日
    浏览(57)
  • 动态规划解决泰波那契数列,爬楼梯最小花费问题

    做题之前我们需要先搞清楚解决动态规划的几个步骤 1 状态表示,准备一个dp表 2 状态转移方程  3 初始化 4 填表 5 返回值 步骤1 状态表示,准备dp表 dp[0] dp[1] dp[2] dp[3] dp[4] = dp[0]+dp[1]+dp[3] 步骤2 状态转移方程表示 dp[i] = dp[i-1]+dp[i-2]+dp[i-3] 步骤3 4 5 都是对代码的细节处理,代码

    2024年02月03日
    浏览(34)
  • 算法刷刷刷|动态规划篇|509.斐波那契数| 70.爬楼梯| 746.使用最小花费爬楼梯| 62.不同路径| 63不同路径2| 343.正数拆分 | 96.不同的二叉搜索树

    509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n 1 给定 n ,请计算 F(n) 。 70.爬楼梯 746.使用最小花费爬楼梯 给你一个整数

    2023年04月23日
    浏览(57)
  • LeetCode刷题笔记【29】:动态规划专题-1(斐波那契数、爬楼梯、使用最小花费爬楼梯)

    动态规划(DP,Dynamic Programming)。 其解题思路对比 贪心算法的“直接选局部最优然后推导出全局最优” ;倾向于“ 由之前的结果推导得到后续的结果 ”。 很多时候二者具有相似性,不必死扣概念。 动态规划题目的核心是dp数组的概念和构建(递推公式); 所以具体的解题步骤

    2024年02月09日
    浏览(40)
  • LeetCode 0746. 使用最小花费爬楼梯:动态规划(原地)——不用什么从递归到递推

    力扣题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/ 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼

    2024年02月03日
    浏览(41)
  • 【LeetCode题目详解】第九章 动态规划part01 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 (day38补)

    斐波那契数  (通常用  F(n) 表示)形成的序列称为 斐波那契数列 。该数列由  0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: 给定  n ,请计算 F(n) 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 30 斐波那契数列大家应该非常熟悉不过了,非常适合作为动规第

    2024年02月07日
    浏览(46)
  • 【动态规划刷题 2】使⽤最⼩花费爬楼梯 && 解码⽅法

    746 . 使用最小花费爬楼梯 链接: 746 . 使用最小花费爬楼梯 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼

    2024年02月15日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包