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

2024-06-13 18:04

本文主要是介绍【动态规划算法题记录】70. 爬楼梯——递归/动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

假设你正在爬楼梯。需要 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];}
};

这篇关于【动态规划算法题记录】70. 爬楼梯——递归/动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058026

相关文章

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/