【动态规划算法题记录】70. 爬楼梯——递归/动态规划

news2024/12/25 0:43:56

题目描述

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

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

题目分析

递归法(超出时间限制)

在这里插入图片描述

  1. 递归参数与返回值
    void reversal(int i, int k)
    每次我们处理第i个台阶到第k个台阶之间的可能性。这里我把结果int cnt放在类成员中了,所以直接在函数中进行处理,不用返回。
  2. 递归终止条件
    当我们处理到最上面的台阶了,也就是reversal(n, n)就可以结束当前递归。
  3. 单层递归逻辑
    单层递归中,我们再将区间(i, k)细分下去:因为我们每次只能上一级或两级台阶,并且上了台阶之后才能处理更高层的范围,所以在缩小范围时,我们针对的是区间的左边。也就是:
for(int j = 1; j <= (k-i) && j <=2; j++){
            reversal(i+j, k);
        }

其中,j就是我们上台阶的可能性,它的取值要小于等于2不能超过区间的大小

最终的cpp递归代码:

class Solution {
private:
    int cnt;
public:
    void reversal(int i, int k){    // 在第i个台阶到第k个台阶之间做决策
        // 递归终止条件:已经到最上面的台阶,cnt加一并返回
        if(i == k){
            cnt++;
            return;
        }

        // 单层递归:从第i个台阶到第k个台阶的可能性
        // j在这里代表是上几个台阶
        for(int j = 1; j <= (k-i) && j <=2; j++){
            reversal(i+j, k);
        }
    }

    int climbStairs(int n) {
        cnt = 0;
        reversal(0, n);
        return cnt;
    }
};

动态规划

  1. 确定dp数组以及下标的含义
    dp[i]:爬到第i级台阶的方法数量。

  2. 确定递推公式
    dp[i] = dp[i-1] + dp[i-2]

因为我们只有两种上楼梯的方法,也即上一级台阶或两级台阶。试想:

  • 我们上到第i-1级台阶时,共有d[i-1]种方法,再上一级则到达第i级台阶;
  • 我们上到第i-2级台阶时,共有d[i-2]种方法,再上两级则到达第i级台阶;

上到第i级台阶也就两种情况,从第i-1级台阶再上一级,或是从第i-2级台阶再上两级,那么我们上到第i级台阶的方法不就是 dp[i-1] + dp[i-2]。这也说明了每一级台阶的状态是由前面两级台阶决定的

  1. dp数组初始化
    dp[1] = 1;
    dp[2] = 2;

因为第0级台阶不存在,所以我们不必纠结dp[0]的值到底如何初始化。

  1. 确定遍历顺序
    因为dp[i]是由它的前两个数决定,所以我们只能从前往后去遍历。

  2. 举例推导dp数组
    例如当n=5
    dp[1]=1;
    dp[2]=2;
    dp[3] = dp[2] + dp[1] = 3;
    dp[4] = dp[3] + dp[2] = 5;
    dp[5] = dp[4] + dp[3] = 8;

动态规划的cpp代码:

class Solution {
public:
    int climbStairs(int n) {
        if(n < 3) return n;

        // 确定dp数组以及下标含义
        vector<int> dp(n+1); //dp[i]是到达第i阶楼梯的方法总数
        
        // 初始化
        dp[1] = 1;
        dp[2] = 2;
        
        // 推导
        for(int i = 3; i <= n; i++){
            dp[i] = dp[i-1] + dp[i-2];
        }

        return dp[n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1819414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

具有不确定性感知注意机制的肺结节分割和不确定区域预测| 文献速递-深度学习结合医疗影像疾病诊断与病灶分割

Title 题目 Lung Nodule Segmentation and UncertainRegion Prediction With an Uncertainty-Aware Attention Mechanism 具有不确定性感知注意机制的肺结节分割和不确定区域预测 01 文献速递介绍 肺结节分割在肺癌计算机辅助诊断&#xff08;CAD&#xff09;系统中至关重…

什么是1+N+b模式的费用直投门店管理体系?

在快消行业&#xff0c;为争夺市场份额&#xff0c;企业每年需投入大量资金。在此过程中&#xff0c;您是否也像李总一样面临着如下困惑&#xff1a; 为解决李总所面临的难题&#xff0c;纷享销客秉承“终端为王”的经营理念&#xff0c;创造性地推出了基于1Nb模式的费用直投门…

携手知名律所,合合信息旗下名片全能王打造数字化名片“新范式”

在低碳办公理念盛行的当下&#xff0c;数字名片成为商务交流的新方式&#xff0c;以数字化智能化赋能绿色化。近期&#xff0c;合合信息旗下名片全能王企业数字名片升级&#xff0c;与上海市律师协会、广州市律师协会、北京大成&#xff08;上海&#xff09;律师事务所等多家律…

如何用Xinstall CPS结算系统打破传统营销桎梏,实现用户增长?

在互联网流量红利逐渐衰退的今天&#xff0c;App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系&#xff0c;成为了众多企业急待解决的问题。而在这个关键时刻&#xff0c;Xinstall CPS结算系统应运而生&#xff0c;以其独特的优势帮助企业解决了一系列…

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(2)

接前一篇文章:ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(1) 上一回讲了笔者在进行ESP-IDF的OTA调试和测试时遇到了一个新问题:大升级文件下载失败。 在网上寻找解决办法无果后,求助于乐鑫的技术支持,答复说官方例程没有问题。笔…

Django之云存储(一)

一、介绍 用户上传的文件以及项目中使用的静态文件,除了保存在本地服务器,还在可以保存在云服务中,比如: 阿里云七牛云(课程选用)亚马逊云等1.1、使用方式 注册账号 七牛云开发者平台 实名认证 创建空间

【高频电子线路】选频网络概述

什么是选频网络 选频网络是用来“滤波”的电路&#xff0c;用来滤除特定频率的信号以得到目标信号。 选频网络的分类 知识补充 电容和电感的基本性质 在电容中&#xff0c;电流与电压的变化率成正比&#xff0c;电流超前90。 在电感中&#xff0c;电压与电流的变化率成正…

算法:模拟题目练习

目录 题目一&#xff1a;替换所有的问号 题目二&#xff1a;提莫攻击 题目三&#xff1a;N字形变换 题目四&#xff1a;外观数列 题目五&#xff1a;数青蛙 首先先解释一下模拟算法是什么&#xff0c;其实模拟算法就是题目让我们干什么我们就干什么&#xff0c;思路比较简…

kettle从入门到精通 第六十八课 ETL之kettle kettle随机数生成的一些方案

1、在做ETL数据抽取的时候&#xff0c;会用到生成随机数的功能&#xff0c;今天我们一起来学习下如何生成随机数据。如下图所示 2、将生成随机数拉倒画布即可&#xff0c;然后设置字段名称和选择合适的类型&#xff0c;如下图所示&#xff1a; 类型&#xff1a; 随机数字&…

【后端】Java学习笔记(二周目-1)

环境 安装JDK8并配置环境变量 jvm核心类库jre jre开发工具jdk Java基础运行流程&#xff0c;代码从上到下&#xff0c;从左往右&#xff0c;只运行一次 桌面—>新建文件夹—>新建记事本—>打开编写代码 public class Hello{public static void main(String[] arg…

sizeof和strlen

1.sizeof和strlen的对比 1.1sizeof sizeof是计算变量所占内存空间大小的&#xff0c;单位是&#xff1a;字节 如果操作数是类型的话&#xff0c;计算的是使用类型创建的变量所占内存空间的大小。 sizeof只关注占用内存空间的大小&#xff0c;不在乎内存中存放的是什么数据 …

深入理解MySQL分区技术

前言&#xff1a; 在数据量不断增长的当今时代&#xff0c;数据库的性能优化变得尤为重要。MySQL作为一款广泛使用的数据库管理系统&#xff0c;提供了多种性能优化手段&#xff0c;其中分区技术是提升大型表处理效率的有效方法之一。通过将数据分散到多个独立的物理子表中&am…

ArcGIS Pro SDK (三)Addin控件 2 窗格界面类

ArcGIS Pro SDK &#xff08;三&#xff09;Addin控件 2 窗格界面类 目录 ArcGIS Pro SDK &#xff08;三&#xff09;Addin控件 2 窗格界面类15 ArcGIS Pro 后台选项卡15.1 添加控件15.2 Code15.2.1 选项卡按钮15.2.2 选项卡页 16 ArcGIS Pro 窗体16.1 添加控件16.2 Code 17 A…

Bean基础配置

黑马程序员SSM 文章目录 一、Bean基础配置二、bean别名配置2.1 ban的别名配置2.2 注意事项 三、Bean作用范围配置3.1 Bean作用范围3.2 bean作用范围说明 一、Bean基础配置 二、bean别名配置 2.1 ban的别名配置 2.2 注意事项 获取bean无论是通过id还是name获取&#xff0c;如果…

webp2jpg网页在线图片格式转换源码

源码介绍 webp2jpg-免费在线图片格式转化器, 可将jpeg、jpg、png、gif、 webp、svg、ico、bmp文件转化为jpeg、png、webp、webp动画、gif文件。 无需上传文件&#xff0c;本地即可完成转换! 源码特点&#xff1a; 无需上传&#xff0c;使用浏览器自身进行转换批量转换输出we…

汇编语言程序设计之数据传输类指令

文章目录 数据传送类指令通用数据传送指令MOVXCHGXLAT 换码指令 堆栈操作指令标志传送指令标志位操作指令地址传送指令 算术运算类指令常用标志位加法指令ADDADCINC 减法指令SUBSBBDECNEGCMP 乘法指令MUL(无符号&#xff09;IMUL&#xff08;有符号&#xff09;MUL和IMUL对符号…

Sa-Token鉴权与网关服务实现

纠错&#xff1a; 在上一部分里我完成了微服务框架的初步实现&#xff0c;但是先说一下之前有一个错误&#xff0c;就是依赖部分 上次的学习中我在总的父模块下引入了spring-boot-dependencies&#xff08;版本控制&#xff09;我以为在子模块下就不需要再引用了&#xff0c;…

传输层——TCP

在学习计算机网络的过程中&#xff0c;我们知道OSI七层协议模型&#xff0c;但是在实际开发应 用中我们发现OSI七层协议模型并不适合实施&#xff0c;因为OSI上三层通常都是由开 发人员统一完成的&#xff0c;这三层之间在实现过程中没有一个明确的界限&#xff0c;所以我 们更…

数据结构逻辑

一&#xff1a;逻辑关系 1、线性关系 2&#xff1a;树型关系 3&#xff1a;图像关系 二&#xff1a;存储关系 1&#xff1a;顺序存储、数据在存储中会开辟一块连续的空间进行存储。一般使用数组来存储数据 2&#xff1a;链式存储、数据在内存中不需要开辟连续的空间进行存储 3…

vba学习系列(5)--指定区域指定字符串计数

系列文章目录 文章目录 系列文章目录前言一、需求背景二、vba自定义函数1.引入库 总结 前言 一、需求背景 想知道所有客诉项目里面什么项目最多&#xff0c;出现过多少次。 二、vba自定义函数 1.引入库 引用&#xff1a; CountCharInRange(区域,“字符串”) Function CountCh…