⭐算法入门⭐《动态规划 - 线性DP》简单01 —— LeetCode 746. 使用最小花费爬楼梯

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《动态规划 - 线性DP》简单01 —— LeetCode 746. 使用最小花费爬楼梯相关的知识,希望对你有一定的参考价值。

🙉饭不食,水不饮,题必须刷🙉

还不会C语言,和我一起打卡!
🌞《光天化日学C语言》🌞

LeetCode 太难?上简单题!
🧡《C语言入门100例》🧡

LeetCode 太简单?大神盘他!
🌌《夜深人静写算法》🌌

一、题目

1、题目描述

  数组的每个下标作为一个阶梯,第 i i i 个阶梯对应着一个非负数的体力花费值 c o s t [ i ] cost[i] cost[i](下标从 0 开始)。每当爬上一个阶梯,都要花费对应的体力值,一旦支付了相应的体力值,就可以选择 向上爬一个阶梯 或者 爬两个阶梯。求找出达到楼层顶部的最低花费。在开始时,可以选择从下标为 0 或 1 的元素作为初始阶梯。
  样例输入: c o s t = [ 1 , 99 , 1 , 1 , 1 , 99 , 1 , 1 , 99 , 1 ] cost = [1, 99, 1, 1, 1, 99, 1, 1, 99, 1] cost=[1,99,1,1,1,99,1,1,99,1]
  样例输出: 6 6 6
如图所以,蓝色的代表消耗为 1 的楼梯,红色的代表消耗 99 的楼梯。

2、基础框架

  • c++ 版本给出的基础框架代码如下:
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
    }
};

3、原题链接

LeetCode 746. 使用最小花费爬楼梯

二、解题报告

1、思路分析

  • 令走到第 i i i 层的最小消耗为 f [ i ] f[i] f[i]
  • 假设当前的位置在 i i i 层楼梯,那么只可能从 i − 1 i-1 i1 层过来,或者 i − 2 i-2 i2 层过来;
  • 如果从 i − 1 i-1 i1 层过来,则需要消耗体力值: f [ i − 1 ] + c o s t [ i − 1 ] f[i-1] + cost[i-1] f[i1]+cost[i1]
  • 如果从 i − 2 i-2 i2 层过来,则需要消耗体力值: f [ i − 2 ] + c o s t [ i − 2 ] f[i-2] + cost[i-2] f[i2]+cost[i2]
  • 起点可以在第 0 或者 第 1 层,于是有状态转移方程:
  • f [ i ] = { 0 i = 0 , 1 min ⁡ ( f [ i − 1 ] + c o s t [ i − 1 ] , f [ i − 2 ] + c o s t [ i − 2 ] ) i > 1 f[i] = \\begin{cases} 0 & i=0,1\\\\ \\min ( f[i-1] + cost[i-1], f[i-2] + cost[i-2] ) & i > 1\\end{cases} f[i]={0min(f[i1]+cost[i1],f[i2]+cost[i2])i=0,1i>1

2、时间复杂度

  • 状态数: O ( n ) O(n) O(n)
  • 状态转移: O ( 1 ) O(1) O(1)
  • 时间复杂度: O ( n ) O(n) O(n)

3、代码详解

class Solution {
    int f[1100];                                                   // (1)
public:
    int minCostClimbingStairs(vector<int>& cost) {
        f[0] = 0, f[1] = 0;                                        // (2)
        for(int i = 2; i <= cost.size(); ++i) {
            f[i] = min(f[i-1] + cost[i-1], f[i-2] + cost[i-2]);    // (3)
        }
        return f[cost.size()];
    }
};
  • ( 1 ) (1) (1)f[i]代表到达第 i i i 层的消耗的最小体力值。
  • ( 2 ) (2) (2) 初始化;
  • ( 3 ) (3) (3) 状态转移;

三、本题小知识

有没有发现,这个问题和斐波那契数列很像,只不过斐波那契数列是求和,这里是求最小值。


以上是关于⭐算法入门⭐《动态规划 - 线性DP》简单01 —— LeetCode 746. 使用最小花费爬楼梯的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《动态规划 - 线性DP》中等01 —— LeetCode 198. 打家劫舍

⭐算法入门⭐《动态规划 - 路径DP》中等01 —— LeetCode 62. 不同路径

⭐算法入门⭐《动态规划 - 状态压缩DP》困难01 —— LeetCode 847. 访问所有节点的最短路径

ACM - 动态规划小白入门:背包 / 线性 / 区间 / 计数 / 数位统计 / 状压 / 树形 / 记忆化 DP

DP入门——线性结构上的动态规划

文末福利算法萌新如何学好动态规划(第二弹)