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开始)。

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

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

1.  样例数据

dp 1 1 7 9 10 9
费用 1 1 6 8 3 0
下标 0  1 2 3 4 终点

2.  分析最优子结构

假设我们现在已经到达了楼顶nums[10],要想得到最小的消耗,那就需要在到达顶楼前的一步就是最小的消耗,到达楼顶前的一步一共有两种走法,

  一个是走一步: 下标4到终点,另一种是走两步:下标3到终点

为得到最优解,我们需要比较这两个走法的最小值.
我们设opt(i)为当前到第i个台阶时的最优解(最小的消耗),到达楼顶时:opt(10) = min{ opt(3) , opt(4) }+nums(5)

3.  分析边界

题目已经告诉我们,第一步可以选择第一阶或者第二阶,所以程序的边界就是opt(0) = nums(0), opt(1) = nums(1)

4.  递归,超时

//1.    递归做法,超时

func Min(i,j int)int{
    if i < j {
        return i
    }
    return j
}
func helper(cost []int,count int) int{
    if count == 0 || count ==1{
        return cost[count]
    }
    sum := Min(helper(cost,count-1),helper(cost,count-2)) + cost[count]
    return sum
}
func minCostClimbingStairs(cost []int) int {
    return Min(helper(cost,len(cost)-1),helper(cost,len(cost)-2))
}

5.  动态规划

/**
     1,1,6,8,3,0
下标:0,1,2,3,4,5终点
到达下标 0 ,需要最小花费1
到达下标 1 ,需要最小花费1
到达下标 2 ,需要最小花费Min(1+6,1+6) = 7
到达下标 3 ,需要最小花费MIn(1+8,7+8) = 9
到达下标 4 ,需要最小花费Min(7+3,9+3) = 10
到达下标 5 ,需要最小花费Min(9+0,10+0) = 9

*/
func minCostClimbingStairs2(cost []int)int{
    if len(cost) == 1{
        return cost[0]
    }else if len(cost) == 2{
        return Min(cost[0],cost[1])
    }
    opt1 := cost[0]
    opt2 := cost[1]
    i := 2
    for i <= len(cost){
        if len(cost) == i {
            return Min(opt1,opt2)
        }else{
            temp := Min(opt1+cost[i],opt2+cost[i])
            opt1 = opt2
            opt2 = temp
        }
    }
    return opt1

}

原文地址:https://www.cnblogs.com/da-peng/p/11624083.html

时间: 2024-10-14 15:48:10

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

746. 使用最小花费爬楼梯

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

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

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

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