746. 使用最小花费爬楼梯

题目描述

数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。

每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。

您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。

示例 1:

输入: cost = [10, 15, 20]

输出: 15

解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。

示例 2:

输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]

输出: 6

解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。

注意:

  1. cost 的长度将会在 [2, 1000]。
  2. 每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。

算法

这是动态规划的题目,比较简单的一类,以经验来看,状态转移方程应为一维。

?目标求到达楼层顶部的最小花费。所谓楼层顶部,比如示例1的cost = [10,15,20],那么楼层顶部在位置cost[2] = 20的后面,就是说走完所有的阶梯0,1,2就能到达楼层顶部了,最后人停在cost[2]的后面。

?开一个数组dp作为状态转移方程,dp[i]代表到达第i个阶梯所需要的最小花费,所以dp数组的大小应该为cost的大小+1,dp[cost.size()]代表到达楼层顶部所需要的最小花费。因此,需要在cost后面也插入一个花费0.

边界条件

  1. cost的大小为1
  2. cost的大小为2

状态转移方程

?由于每一次可以走1个楼梯或者两个楼梯,所以第i个阶梯的最小花费应该和第i-1和第i-2个阶梯的最小花费有关,为它们两个的最小值与第i个阶梯的花费之和

代码

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

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int size = cost.size();
        if(size == 1)
            return cost[0];

        if(size == 2)
            return min(cost[0], cost[1]);
        // dp[i]代表到达第i和阶梯所需要的最小花费
        int dp[size+1];
        cost.push_back(0);
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i = 2; i <= size; i++)
        {
            dp[i] = min(dp[i-2], dp[i-1]) + cost[i];
        }
        return dp[size];
    }
};

int main()
{
    Solution s;
    vector<int> cost = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
    cout << s.minCostClimbingStairs(cost) << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/shayue/p/10352934.html

时间: 2024-11-19 02:47:15

746. 使用最小花费爬楼梯的相关文章

力扣 746. 使用最小花费爬楼梯

数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi. 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯. 您需要找到达到楼层顶部的最低花费.在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯. 示例 1: 输入: cost = [10, 15, 20] 输出: 15 解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15. 示例 2: 输入: cost = [1, 100, 1, 1, 1, 1

746使用最小花费爬楼梯

参考答案,特别鸣谢:https://leetcode-cn.com/problems/min-cost-climbing-stairs/solution/scala-dong-tai-gui-hua-di-gui-by-zx233/ 0. 题目描述 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯. 您需要找到达到楼层顶部的最低花费.在开始时,你可以选择

746. 使用最小花费爬楼梯(动态规划题)

数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯. 您需要找到达到楼层顶部的最低花费.在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯. 本题想了好久,不知道为啥要从顶向下写,直接照抄了答案 状态转移方程:  本题的状态转移方程是逆向的,也没有特殊情况 f[i] = min(f[i+1],f[i+2]) + num 原文地址:https://

LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)

题目标签:Dynamic Programming 题目给了我们一组 cost,让我们用最小的cost 走完楼梯,可以从index 0 或者 index 1 出发. 因为每次可以选择走一步,还是走两步,这里用 dynamic, 从index 2 (第三格楼梯开始) 计算每一个楼梯,到达需要用的最小cost. 在每一个楼梯,只需要计算 从前面2格楼梯过来的cost, 和 从前面1格楼梯过来的 cost,哪个小.就选哪个叠加自己的cost.最后 index = len 的地方就是走到top 所用的最小

[Swift]LeetCode746. 使用最小花费爬楼梯 | Min Cost Climbing Stairs

On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the step w

Leetcode 746. Min Cost Climbing Stairs 最小成本爬楼梯 (动态规划)

题目翻译 有一个楼梯,第i阶用cost[i](非负)表示成本.现在你需要支付这些成本,可以一次走两阶也可以走一阶. 问从地面或者第一阶出发,怎么走成本最小. 测试样例 Input: cost = [10, 15, 20] Output: 15 Explanation: 从第一阶出发,一次走两步 Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] Output: 6 Explanation: 从地面出发,走两步,走两步,走两步,走一步,走两步,走一

746. Min Cost Climbing Stairs 最不费力的加权爬楼梯

[抄题]: On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the

结对合作-乘坐电梯的所有乘客爬楼梯的层数之和最少

组员 石鹤李海超 一.题目 石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停.信1201-1班的张一东觉得在每层都停觉得不耐烦. 由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层.在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层. 问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少. 二.设计思想 算出停在各层需要爬的层数,比较得出最小的. 我也考虑了老师说的优化方法,但我觉得假如2层和4层都满足那种条件,而那个公式没

回溯解决爬楼梯问题

1.问题描写叙述 每次爬楼梯有每次可跨1,2,3步.爬上一个N阶楼梯有多少种方式,打印出每种方式. 2.源码 // ConsoleApplication6.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <vector> #include <map> using namespace std; typedef std::vector<int> V