首页 > 其他分享 >70_爬楼梯

70_爬楼梯

时间:2024-10-24 18:47:22浏览次数:2  
标签:爬楼梯 int return 爬法 70 楼梯 dp

70_爬楼梯

【问题描述】

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

【算法设计思想】

  1. 定义状态
    • 状态是指问题的一个特定阶段的状态。对于“爬楼梯”问题,状态可以定义为 dp[i],表示到达第 i 阶楼梯的方法数。
  2. 确定状态转移方程
    • 状态转移方程描述了如何从一个或多个先前的状态转移到当前状态。对于“爬楼梯”问题,状态转移方程为 dp[i] = dp[i - 1] + dp[i - 2],表示到达第 i 阶楼梯的方法数等于到达第 (i-1) 阶楼梯的方法数加上到达第 (i-2) 阶楼梯的方法数。
  3. 初始化
    • 初始化一些基本情况,以便开始递推计算。对于“爬楼梯”问题,初始化 dp[1] = 1dp[2] = 2,表示到达第1阶楼梯有一种方法,到达第2阶楼梯有两种方法。
  4. 确定计算顺序
    • 确定状态的计算顺序,通常是从已知状态逐步推导到最终状态。对于“爬楼梯”问题,计算顺序是从 i = 3 开始,逐步计算到 i = n
  5. 返回结果
    • 最后返回所需的最终结果。对于“爬楼梯”问题,返回 dp[n],即到达第 n 阶楼梯的方法数。

【算法描述】

C++:

class Solution {
public:
    int climbStairs(int n) {
        // 如果楼梯只有1阶,那么只有一种爬法,直接返回1
        if (n == 1) return 1;
        
        // 如果楼梯有2阶,那么有两种爬法:一次爬1阶两次,或者一次爬2阶,直接返回2
        if (n == 2) return 2;

        // 创建一个大小为n+1的数组dp,用于存储从第0阶到第n阶的爬法数量
        int dp[n + 1];

        // 初始化dp数组的前几个值
        dp[0] = 0; // 从第0阶开始,没有爬法
        dp[1] = 1; // 从第1阶开始,只有一种爬法
        dp[2] = 2; // 从第2阶开始,有两种爬法

        // 从第3阶开始,使用动态规划计算每一阶的爬法数量
        for (int i = 3; i <= n; i++) {
            // 到达第i阶的爬法数量等于到达第(i-1)阶的爬法数量加上到达第(i-2)阶的爬法数量
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        // 返回到达第n阶的爬法数量
        return dp[n];
    }
};

Java:

class Solution {
    public int climbStairs(int n) {
        // 如果楼梯只有1阶,那么只有一种爬法,直接返回1
        if (n == 1) {
            return 1;
        }
        
        // 如果楼梯有2阶,那么有两种爬法:一次爬1阶两次,或者一次爬2阶,直接返回2
        if (n == 2) {
            return 2;
        }

        // 创建一个大小为n+1的数组dp,用于存储从第0阶到第n阶的爬法数量
        int[] dp = new int[n + 1];

        // 初始化dp数组的前几个值
        dp[1] = 1; // 从第1阶开始,只有一种爬法
        dp[2] = 2; // 从第2阶开始,有两种爬法

        // 从第3阶开始,使用动态规划计算每一阶的爬法数量
        for (int i = 3; i <= n; i++) {
            // 到达第i阶的爬法数量等于到达第(i-1)阶的爬法数量加上到达第(i-2)阶的爬法数量
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        // 返回到达第n阶的爬法数量
        return dp[n];
    }
}

Python:

class Solution:
    def climbStairs(self, n: int) -> int:
        # 创建一个大小为n+1的列表dp,用于存储从第0阶到第n阶的爬法数量
        dp = [0] * (n + 1)

        # 如果楼梯只有0阶,根据题目假设,返回0(实际上这种情况可能不需要处理)
        if n == 0:
            return 0
        
        # 如果楼梯只有1阶,那么只有一种爬法,直接返回1
        if n == 1:
            return 1
        
        # 如果楼梯有2阶,那么有两种爬法:一次爬1阶两次,或者一次爬2阶,直接返回2
        if n == 2:
            return 2

        # 初始化dp数组的前几个值
        dp[0] = 0  # 从第0阶开始,没有爬法
        dp[1] = 1  # 从第1阶开始,只有一种爬法
        dp[2] = 2  # 从第2阶开始,有两种爬法

        # 从第3阶开始,使用动态规划计算每一阶的爬法数量
        for i in range(3, n + 1):
            # 到达第i阶的爬法数量等于到达第(i-1)阶的爬法数量加上到达第(i-2)阶的爬法数量
            dp[i] = dp[i - 1] + dp[i - 2]

        # 返回到达第n阶的爬法数量
        return dp[n]

C:

int climbStairs(int n) {
    // 如果楼梯只有1阶,那么只有一种爬法,直接返回1
    if (n == 1) return 1;
    
    // 如果楼梯有2阶,那么有两种爬法:一次爬1阶两次,或者一次爬2阶,直接返回2
    if (n == 2) return 2;

    // 创建一个大小为n+1的数组dp,用于存储从第0阶到第n阶的爬法数量
    int dp[n + 1];

    // 初始化dp数组的前几个值
    dp[0] = 0; // 从第0阶开始,没有爬法
    dp[1] = 1; // 从第1阶开始,只有一种爬法
    dp[2] = 2; // 从第2阶开始,有两种爬法

    // 从第3阶开始,使用动态规划计算每一阶的爬法数量
    for (int i = 3; i <= n; i++) {
        // 到达第i阶的爬法数量等于到达第(i-1)阶的爬法数量加上到达第(i-2)阶的爬法数量
        dp[i] = dp[i - 1] + dp[i - 2];
    }

    // 返回到达第n阶的爬法数量
    return dp[n];
}

标签:爬楼梯,int,return,爬法,70,楼梯,dp
From: https://www.cnblogs.com/zeta186012/p/18500233

相关文章

  • HONEYWELL 05330700测厚仪板卡选购指南
    HONEYWELL(霍尼韦尔)测厚仪板卡是霍尼韦尔公司提供的一种用于测量材料及物体厚度的仪表的关键组件。以下是对HONEYWELL测厚仪板卡的详细介绍:一、主要作用测厚仪板卡主要作用在于测量各种材料(如钢板、钢带、薄膜、纸张、金属箔片等)的厚度,并将测量结果转化为电讯号输出,以便进一步......
  • 力扣 简单 70.爬楼梯
    文章目录题目介绍题解题目介绍题解思路分析:确定dp数组以及下标的含义:dp[i]:爬到第i层楼梯,有dp[i]种方法确定递推公式:从dp[i]的定义可以看出,dp[i]可以有两个方向推出来。首先是dp[i-1],上i-1层楼梯,有dp[i-1]种方法,那么再一步跳一个台阶不就是dp[i]了么。还有......
  • DAY42 ||完全背包理论 | 518. 零钱兑换 II | 377. 组合总和 Ⅳ|70. 爬楼梯 (进阶)
    完全背包理论什么是完全背包:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。不......
  • P7074 [CSP-J2020] 方格取数 题解
    动态规划dp方格取数类似于数字三角形,均可以使用动态规划直接秒杀.但此题有$3$个方向:上、右、下.所以可以定义一个三维数组dp数组.假设$f_{i,j,1}$是从右、上方到达$(i,j)$的和的最大值.又有$f_{i,j,0}$是从右、下方到达$(i,j)$的和的最大值.我们可以先确定......
  • P7071 [CSP-J2020] 优秀的拆分 题解
    二进制"优秀的拆分"如果存在,则代表$n$的二进制最低位不是$1$.$\because2^0=1$$\therefore$当$n$的二进制最低位为$1$时,不存在优秀的拆分.即$n$不是奇数.上述条件判断完后,就可以从$2$的$30$次方开始模拟(int的上限是$2^{31}-1$).代码#include<iostream>......
  • P7072 [CSP-J2020] 直播获奖 题解
    暴力使用$\Theta(n^2)$的时间复杂度来解决这题大约能拿到$60pts$.即枚举$p$,再枚举每个选手的分数.正解桶是个好东西.我们开一个桶,记录当前分数有多少人.然后计算获奖人数,分数从大到小进行枚举,直到当前人数$\ge$获奖人数.代码#include<iostream>#include<cstdio>#i......
  • SQL实战训练之,力扣:1709. 访问日期之间最大的空档期
    目录        一、力扣原题链接        二、题目描述        三、建表语句        四、题目分析                五、SQL解答        六、最终答案        七、验证        八、知识点一、......
  • 使用livox mid 70提取特征点过程
    参考链接使用rviz显示bag数据LOAM-Preprocessingloam_livox实现第一版读了一下驱动程序说明书创建了ros环境,创建了demo功能包,创建了类,订阅话题"/livox/lidar"激光雷达数据,不处理直接发布,发布话题"/full"在rviz中查看。说明书首先,览沃ROS驱动程序可以看到广播码说明......
  • PMP--必刷题–解题–61-70
    文章目录4.整合管理--问题日志--61、[单选]一个软件交付项目开始遇到技术障碍,这个问题可能导致交付物延迟。技术服务团队一直在处理这个问题,但即使经过1周的维护,问题仍未解决。高级项目经理现在应该怎么做?62、[单选]客户要求项目经理提供项目状态报告。项目经理发送......
  • AbMole|Apilimod mesylate Apilimod甲磺酸盐(CAS号 870087-36-8;目录号M9418)
    Apilimodmesylate(STA5326mesylate,Apilimod甲磺酸盐)是Apilimod的甲磺酸盐形式,也是一种具有口服活性的IL-12/IL-23抑制剂,抑制IFN-γ/LPS刺激的人PBMC产生IL-12的IC50值为10nM。可用于难治性葡萄膜炎的相关研究。生物活性Apilimod甲磺酸盐是一种IL-12/IL-23抑制剂,抑制IFN-......