【手撕算法|动态规划系列No.2】leetcode面试题 08.01. 三步问题

news2024/11/24 5:19:58

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
在这里插入图片描述

点击直接跳转到该题目

目录

  • 🥙题目描述
  • 🎂算法原理+题目解析
  • 🍰解题代码
  • 🍱总结

🥙题目描述

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:

输入:n = 3
输出:4
说明: 有四种走法

示例2:

输入:n = 5
输出:13

提示:

n范围在[1, 1000000]之间

🎂算法原理+题目解析

步骤1(最重要)状态表示

dp[i]为结尾dp[i]表示到达i位置时一共有多少种方法。

步骤2(最难):状态转移方程

我们以i位置的状态,通过最近的一步或者几步来划分问题。通过题目要求,这里最近的几步分别是dp[i-3]、dp[i-2]、dp[i-1],所以我们需要找到这几步的状态。
也就是说这里分为三种情况:
i-3位置跳3步到达i位置,需要先经过i-3位置才能继续跳三步。假设需要x种方法,有多少种方法到达i-3位置,就有多少种方法从起点到达i位置
i-2位置跳2步到达i位置,需要先经过i-2位置才能继续跳二步。假设需要y种方法,有多少种方法到达i-2位置,就有多少种方法从起点到达i位置
i-1位置跳1步到达i位置,需要先经过i-1位置才能继续跳三步。假设需要z中方法,有多少种方法到达i-1位置,就有多少种方法从起点到达i位置
所以,到达第i个位置的总方法数=到达i-3位置的总方法数+到达i-2位置的总方法数+到达i-1位置的总方法数。即x+y+z。我们已经知道dp[i]表示到达i位置时一共有多少种方法。所以dp[i-3]=xdp[i-2]=ydp[i-1]=z
故最终的状态表示方程即dp[i]=dp[i-3]+dp[i-2]+dp[i-1]

步骤3:初始化

根据题目要求,dp[1]=1、dp[2]=2、dp[3]=4

步骤4:填表顺序

我们如果想要知道dp[i]位置的状态,就需要知道dp[i-3]、dp[i-2]、dp[i-1]位置的状态,否则无法推导出dp[i]位置的状态,所以我们应该从左往右进行填表。

步骤5:返回值

由于dp[i]表示到达i位置时一共有多少种方法,所以我们直接返回dp[n]就好了。

本题尤其要注意提示部分,由于返回的数据值比较大,所以我们需要进行模运算,尤其是返回值的处理,请看:dp[i]=((dp[i-1]+dp[i-2])%MOD+dp[i-3])%MOD;这里进行模运算的时候并不是统一加完之后一起进行模运算,而每加一次dp值就需要进行模运算,即加一次dp值就需要进行一次模运算、加一次dp值就需要进行一次模运算。

🍰解题代码

class Solution {
public:
    int waysToStep(int n) {
        const int MOD =1e9+7; 
        //创建dp表
        vector<int> dp(n+1);
        
        //初始化处理边界条件
        if(n==1||n==2) return n;
        if(n==3) return 4;
        
        dp[1]=1;dp[2]=2;dp[3]=4;

        //填表
        for(int i=4; i<=n; i++)
            dp[i]=((dp[i-1]+dp[i-2])%MOD+dp[i-3])%MOD;

        //返回值
        return dp[n];
    }
};

🍱总结

该问题依然是属于动态规划类型的题目,思考的时候大体就是按照那5步(状态表示、状态转移方程、初始化来进行边界处理、填表顺序、返回值)来想,在进行代码编写的时候基本就是按照那4步进行编写(创建dp表,初始化、填表、返回值)。

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

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

相关文章

linux入门练级篇 第二讲 基本指令2

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

MySQL Optimization Learning(一)

目录 一、MySQL性能监控 1、show profile 2、performance schema 2.1、MYSQL performance schema详解 3、show processlist 一、MySQL性能监控 MySQL官网 拖到首页最下方找到 MySQL Reference Manual ->cmd命令行 C:\Users\Administrator>mysql -uroot -proot …

vue vant Calendar日历定制

calendar文档 <template> ...<Calendar :min-date"start" :max-date"end":title"null" :show-mark"false" :show-subtitle"false" :show-confirm"false" :show-title"true":poppable"fa…

Mongodb 对于Sort排序能够支持的最大内存限制查看和修改

报错&#xff1a; Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit. MongoDB Server对于Sort排序能够支持的最大内存限制查看&#xff1a; [rootdata…

MySQL8.0 创建用户、配置用户权限、添加外网访问

MySQL8.0 创建用户、配置用户权限、添加外网访问 添加用户、外网访问 在MySQL 8.0中&#xff0c;root用户的外网访问权限默认是被禁止的。要修改root用户的外网访问权限&#xff0c;您需要进行以下步骤&#xff1a; 连接到MySQL服务器。您可以使用MySQL命令行客户端或其他数据…

1.mac M1 Java 开发环境的安装与配置

1.首先我们打开谷歌浏览器复制下面的网址安装jdk&#xff1a; Java Download | Java 7, Java 8, Java 11, Java 13, Java 15, Java 17, Java 19 - Linux, Windows and macOShttps://www.azul.com/downloads/?packagejdk#zulu 2.我们翻到最下面去选择我们需要的版本&#xff…

第三代互联网(Web3.0)

第三代互联网&#xff0c;也被称为Web3.0&#xff0c;是互联网发展的新阶段。Web3.0是指一种基于人工智能、区块链、物联网等技术的新一代互联网。相对于Web2.0&#xff0c;Web3.0的特点是更加分布式、去中心化、安全、隐私保护、智能化和可信任。 Web3.0的主要特点包括&#…

vue3插槽

匿名插槽 父组件 <template><h1>插槽</h1><A> 我是匿名插槽 </A> </template><script setup>import { ref } from vue;import A from ./A.vue; </script><style></style>子组件 <template><div>&l…

FastDDS 源码剖析:DDS部分 - typesDomainParticipant分析

目录 types分析 DomainParticipant分析 DomainParticipant的主要作用 DomainParticipant实现的一些关键原理&#xff1a; 源码剖析 types分析 位于src/cpp/dds中的types.cpp文件和位于include/dds/core中的types.hpp文件是FastDDS库的核心实现的一部分。 hpp文件是声明null…

【链表OJ】链表分割

⭐️ 往期相关文章 &#x1f4ab;链接1&#xff1a;链表中倒数第k个结点(快慢指针问题) &#x1f4ab;链接2&#xff1a;leetcode 876.链表的中间结点(快慢指针问题) &#x1f4ab;链接3&#xff1a;leetcode 206.反转链表 &#x1f4ab;链接4&#xff1a;leetcode 203.移除链…

[Golang实战] sql建表,不用外键,多个表之间如何建立起联系?

问题描述 下面是我的建表语句&#xff0c;在其中我并没有使用到外键&#xff0c;去关联三个表&#xff0c;但是我发现三个表中具有隐式的关联关系 create database library; use library; DROP TABLE IF EXISTS user;CREATE TABLE user(id bigint(20) NOT NULL AUTO_INCREMEN…

Java基础-多线程JUC-线程池和自定义线程池

1. 线程池 主要核心原理 不推荐Executors创建没有上线的线程池&#xff0c;建议使用自定义的线程池&#xff1b; Java工具类创建线程池&#xff1b; public class demo16 {public static void main(String[] args) {/*** public static ExecutorService newCachedThreadPoo1() …

一款打击感超强的动作游戏《流星蝴蝶剑》

文章目录 玩法介绍1.介绍2.按键操作3.流星蝴蝶剑各种武器招式秘籍 游戏优点游戏缺点游戏停服的原因游戏后续发展常见的的游戏道具1.四种水晶2.四种包子3.多种属性加成道具 《流星蝴蝶剑》的游戏打击感分析1.什么是游戏打击感2.影响游戏打击感的经典要素3.几个体现打击感的镜头动…

国产自研GPT大语言模型|实在智能TARS

目录 前言 TARS名字由来 实在智能 TARS 应用演示 大模型RPA 大模型IDP 最后 前言 Chat-GPT问世以来&#xff0c;国内外知名公司纷纷加入到大模型的研发行列中&#xff0c;2023年无疑成为大模型发展元年。百度、谷歌等科技巨头百家争鸣&#xff0c;新锐科技公司也不甘…

成为自动化测试的7种技能

目录 前言&#xff1a; 1.自动化测试员技能——编程语言 设计框架 2.自动化测试员技能–出色的手动测试技能 人眼就是一切 某些测试只能手动完成 自动化测试可能包含漏洞 某些方案不适用于自动化测试 您对整个问题都有个想法 3.自动化测试员技能–自动化工具专业知识…

【教你做直播产品】线上K歌软件开发技术选型

摘要 在线K歌软件的开发有许多技术难点&#xff0c;需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外&#xff0c;此外&#xff0c;开发者还应关注音乐版权问题&#xff0c;确保开发的应用合规合法。 前言 前面写了几期关于直播 …

中小企业如何应用大数据?_光点科技

随着信息技术的快速发展&#xff0c;大数据已经成为当今商业世界中的热门话题。大数据不仅对大型企业有益&#xff0c;对中小企业同样具有巨大潜力。然而&#xff0c;很多中小企业对于如何应用大数据感到困惑。 首先&#xff0c;中小企业可以利用大数据来优化营销策略。大数据分…

AidLux+无人机——AI电力巡检新模式

近年来&#xff0c;航空、遥感、以及信息处理等技术迅速发展&#xff0c;使得无人机在电力巡检上逐渐应用开来。 无人机电力巡检作为新型电力巡检方式&#xff0c;不受地形地貌限制、便携易用且高效&#xff0c;能够极大程度降低传统巡检工作的风险和失误&#xff0c;提升工作…

<QT开发> QT开发工具-之-QT应用程序打包

&#xff1c;QT开发&#xff1e; QT开发工具-之-QT应用程序打包 一 前言 笔者为什么会写这篇文章呢&#xff1f;这是因为&#xff0c;笔者使用windows QT开发了一个测试工具。目的是通过TCP/IP测试其它应用程序。首先这个QT程序是笔者自己开发的&#xff0c;所以笔者的电脑当…

如何写出一份还OK的英文简历

大家好&#xff0c;其实对于SAP这个全球超过80%都会用的ERP软件&#xff0c;对于我们顾问而言&#xff0c;永远都有成长空间。 当你技术达到一定水平的时候&#xff0c;你会发现受语言限制更多。 比如国内项目做得差不多了&#xff0c;想尝试国外global项目&#xff1b;或是遇…