【动态规划】02斐波那契数列模型_三步问题(easy)

题目链接:leetcode三步问题


目录

题目解析:

算法原理:

1.状态表示

2.状态转移方程

3.初始化

4.填表顺序

5.返回值

编写代码:


题目解析:

题目让我们求小孩到达n阶台阶的时候,可以有多少上楼梯方式;

由题可得:

小孩一次可以上1阶、2阶或3阶:

我们这里逐个在每一阶的上楼方式分析一下,看看有什么规律:

1.假设n=1,即到达一阶

显然,我们只有一种方式:只跳一阶即可直达。

2.当n=2,即到达2阶:

第一种方式:

我们可以从0开始一步直接到达2的位置(0-->2)

所以有一种方法

第二种方式是

不管你用什么方法,跳到1后,再从1加一步跳到2;

显然,我们跳到1台阶只有0-->1这一种方法,我们只需再跳一步0-->1-->2,就可从1到达2;

所以有一种方法

所以到达台阶2一共有两种方法

3.当n=3,即到达3阶:

第一种方式:

我们可以从0开始一步直接到达3的位置(0-->3),

所以有一种方法

第二种方式是

不管你用什么方法,跳到1后,再从1加一步直接跳到3

显然,我们跳到1台阶只有0-->1这一种方法,我们只需再跳一步0-->1-->3,就可从1到达3;

所以有一种方法

第二种方式是

不管你用什么方法,跳到2后,再从2加一步直接跳到3

显然,我们跳到2台阶有(0-->2)和(0-->1-->2)这两种方法

我们只需再跳一步

0-->2-->3

0-->1-->2-->3

就可从2到达3;

所以有两种方法

所以到达台阶2一共有4种方法

4.当n=4,即到达4阶:

 第一种方式:

不管你用什么方法,跳到1后,再从1加一步直接跳到4

显然,我们跳到1台阶只有0-->1这一种方法,我们只需再跳一步0-->1-->4,就可从1到达4;

所以有一种方法

第二种方式是

 不管你用什么方法,跳到2后,再从2加一步直接跳到4

显然,我们跳到2台阶有(0-->2)和(0-->1-->2)这两种方法

我们只需再跳一步

0-->2-->4

0-->1-->2-->4

就可从2到达4;

所以有两种方法

第二种方式是

不管你用什么方法,跳到3后,再从3加一步直接跳到4

显然,我们跳到3台阶有这4种方法

我们只需再跳一步,根据以上规律:

……-->3-->4

……-->3-->4

……-->3-->4

……-->3-->4

就可从3到达4;

所以有四种方法

所以到达台阶4一共有1(方式一:直接从1->4)+2(方式二:直接从2->4)+4(方式三:直接从3->4)种方法(7种)

分析到这里:我们可以得到一个规律:

到达某一阶的方法=到达它前三阶的方法的和


算法原理:

1.状态表示

先创建一个dp表

首先先思考dp表里面的值所表示的含义(是什么?)

dp[i]表示到达i台阶一共有多少种方法。

这种状态表示怎么来的?

1.题目要求

小孩到达某台阶一共有多少方法

2.经验+题目要求

经验:以i位置为结尾,分析它前面几步的状态;

2.状态转移方程

dp[i]等于什么?

综上分析:

dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

3.初始化

(保证填表的时候不越界)

由题目得:n范围在[1, 1000000]之间

从上面的dp[i]公式,我们发现当i=1、2、3时等号后面的dp[i-1]、dp[i-2]、dp[i-3]会越界

所以我们这里需要将i=1、2、3初始化,并在写代码时在前面先条件判断;

4.填表顺序

(为了填写当前状态的时候,所需要的状态已经计算过了)

这里所需要的状态是:

这里所需要的状态是:dp[i-1]、dp[i-2]、dp[i-3];

这几个数都是在i之前的,

所以我们这里是从左向右填表;

5.返回值

(根据题目要求和状态表示)

综上分析:

返回值为:dp[n]


编写代码:

class Solution {
public:
    int waysToStep(int n) {
        //1.创建dp表
        //2.初始化
        //3.填表
        //4.返回结果

        const int MOD=1e9+7;
        
        if(n==1)
            return 1;
        else if(n==2)
            return 2;
        else if(n==3)
            return 4;

        else
        {        
            vector<int> dp(n+1);
            dp[1]=1;dp[2]=2;dp[3]=4;
            for(int i=4;i<n+1;i++)
            {
                dp[i]=((dp[i-1]+dp[i-2])% MOD+dp[i-3])% MOD;
            }
            return dp[n];
        }

       
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

作业12.7

1.实现一个登录窗口界面 源文件&#xff1a; #include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {//设置界面大小&#xff0c;名称与图标this->setFixedSize(1280,720);this->setWindowTitle("泰坦陨落");thi…

Adobe系列软件:创意之旅的得力助手

在数字创意领域&#xff0c;Adobe系列软件一直以其卓越的性能和广泛的应用而备受瞩目。从图像处理、视频编辑到音频编辑&#xff0c;从网页开发到排版设计&#xff0c;这些软件都提供了强大的功能和工具&#xff0c;帮助用户实现他们的创意。 让我们详细介绍这些软件的作用&…

使用python操作excel文档

导入xlsxwriter包 python轻量化的语言&#xff0c;用来操作文档简直易如反掌&#xff0c;首先你需要导入的是import xlsxwriter包&#xff0c;他包括了操作文档所需要的全部工具方法&#xff0c;你只需要调用就好了。 操作excel指南 首先你需要创建一个文件xlsxwriter.Workb…

1.10 C语言之外部变量与作用域

1.10 C语言之外部变量与作用域 一、外部变量概述二、练习 一、外部变量概述 我们说&#xff0c;函数&#xff08;不管是main函数还是其他函数&#xff09;内部定义的变量&#xff0c;其作用范围都只在函数内部&#xff0c;我们把这些变量叫做自动变量或者局部变量。除了局部变…

从文字到使用,一文读懂Kafka服务使用

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

【UE5】瞬移+马赛克过渡效果

效果 步骤 1. 新建一个工程&#xff0c;创建一个Basic关卡 2. 添加第三人称游戏资源到内容浏览器 3. 新建一个材质&#xff0c;这里命名为“M_Pixel” 打开“M_Pixel”&#xff0c;设置材质域为“后期处理” 在材质图表中添加如下节点 此时效果如下&#xff0c;已经有马赛克的…

Textual Inversion

参考博客1:https://www.bilibili.com/read/cv25430752/

数据结构和算法-栈

数据结构和算法-栈 1. 栈的介绍 栈的介绍&#xff1a; 栈的英文为(stack)栈是一个先入后出的有序列表栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端&#xff0c;为变化的一端&#xff0c;称为栈顶&#xff0c;另一端为固…

2024 年前端技术发展大趋势一览

随着技术的不断演进&#xff0c;前端开发领域也在不断变化和发展。AI、Vue、Web3等都是当前前端开发的新趋势&#xff0c;它们为开发者提供了更多的机会和挑战。今天这篇文章&#xff0c;咱们就来聊一聊&#xff0c;最新前端技术趋势。 1.AI 年初的 ChatGPT 火爆全网&#xff0…

MongoDB的连接数据库,创建、删除数据库,创建、删除集合命令

本文主要介绍MongoDB的连接数据库&#xff0c;创建、删除数据库&#xff0c;创建、删除集合命令。 目录 MongoDB连接数据库连接到本地 MongoDB 实例连接到远程 MongoDB 实例 MongoDB创建和删除数据库MongoDB创建和删除集合创建集合删除集合 MongoDB连接数据库 连接 MongoDB 数…

SuperMap iObject.NET三维场景拖拽框选实现详解及完整源代码(一)——环境准备及项目配置

作者&#xff1a;超图研究院技术支持中心-于丁1 SuperMap iObject.NET三维场景拖拽框选实现详解及完整源代码&#xff08;一&#xff09;——环境准备及项目配置   三维场景框选是一种在三维空间中进行选择和操作的功能&#xff0c;它可以让使用者通过鼠标拖动来创建一个矩形…

kafka C++实现消费者

文章目录 1 Kafka 消费者的逻辑2 Kafka 的C API2.1 RdKafka::Conf2.2 RdKafka::Event2.3 RdKafka::EventCb2.4 RdKafka::TopicPartition2.5 RdKafka::RebalanceCb2.6 RdKafka::Message2.7 RdKafka::KafkaConsumer&#xff08;核心&#xff09; 3 Kafka 消费者客户端开发3.1 必要…

springboot监听器模式源码精讲

1.前言 很多时候我们看源码的时候看不下去&#xff0c;其中一个原因是系统往往使用了许多设计模式&#xff0c;如果你不清楚这些设计模式&#xff0c;这无疑增加了你阅读源码的难度。 springboot中就大量使用了设计模式&#xff0c;本文主要介绍其中的一种监听器模式&#xf…

谈谈 .NET8 平台中对 LiteDB 的 CRUD 操作

哪个啥&#xff01;纯 C# 编写的 LiteDB 你还不会操作&#xff1f; LiteDB 简介LiteDB 安装1、同步版 LiteDB2、异步版 LiteDB.Async LiteDB StudioLiteDB CRUD 操作举例1、.net cli 命令创建项目2、项目添加相关 nuget 包3、改造项目结构4、改造项目代码 LiteDB vs SQLite 对比…

泳道图绘制全攻略,一图胜千言,快速上手

泳道图是一种流程图的形式&#xff0c;通过在不同的泳道中展示不同的参与者&#xff0c;帮助我们更好地理解和分析流程。它是一种非常有用的工具&#xff0c;可以帮助我们在团队协作、流程管理和问题解决等方面取得更好的效果。 1. 泳道图的定义 泳道图是一种以泳道为基础的流程…

postgresql从入门到精通 - 第37讲:postgres物理备份和恢复概述

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第37讲&#…

提高工厂能源效率的关键:工厂能耗监测平台

工业做为能源消耗的重要场所&#xff0c;所以节能减排对工业来讲是一个亟需解决的问题。除了对设备进行更新换代外&#xff0c;还需要能源管理消耗监测平台&#xff0c;帮助企业实现节能减排的目标。 工厂能源消费量非常庞大&#xff0c;能源比较难以监测与控制。传统能源的管…

路径规划之RRT算法

系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之A *算法 路径规划之D *算法 路径规划之PRM算法 路径规划之RRT算法 路径规划之RRT算法 系列文章目录前言一、RRT算法1.起源2.流程3. 优缺点3.1 优点3.2 缺点 4. 实际效果 前言 PRM方法相比于传…

正则表达式(3):入门

正则表达式&#xff08;3&#xff09;&#xff1a;入门 小结 本博文转载自 从这篇文章开始&#xff0c;我们将介绍怎样在Linux中使用”正则表达式”&#xff0c;如果你想要学习怎样在Linux中使用正则表达式&#xff0c;这些文章就是你所需要的。 在认识”正则表达式”之前&am…

图像处理之把模糊的图片变清晰

1.图片如果是有雾化效果的对图像产生影响的,要先进行图形增强,Retinex是基于深度神经网络了,我在之前图形处理的文章一路从神经网络(概率统计)—>积卷神经网络(对区域进行概率统计,对图片进行切割多个识别对象)–>深度积卷神经网络(RetinexNet也是模拟人脑的处理过程,增加…