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

news2024/11/25 6:34:00

题目链接: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];
        }

       
    }
};

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

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

相关文章

理解IO复用的三种模式——select、poll、epoll

文章目录 一、Select1、select简介2、select实现原理3、select编程4、select常见问题 二、poll1、poll简介2、poll实现原理3、poll编程4、poll常见问题 三、epoll1、epoll简介2、epoll实现原理3、epoll编程4、epoll常见问题 Linux IO模型是指Linux操作系统中用于实现输入输出的…

MySQL 包含查询特殊符号数据

当你模糊查询包含特殊符号的数据时&#xff0c;如果不加上特殊处理&#xff0c;查询结果是错误的。 如果你查的数据包含如上字符或者其他特殊字符&#xff0c;需要加上\转义字符。 如下示例&#xff1a; SELECT * FROM t_bc_user t where t.name LIKE %\_%

四、分代垃圾回收机制及垃圾回收算法

学习垃圾回收的意义 Java 与 C等语言最大的技术区别&#xff1a;自动化的垃圾回收机制&#xff08;GC&#xff09; 为什么要了解 GC 和内存分配策略 1、面试需要 2、GC 对应用的性能是有影响的&#xff1b; 3、写代码有好处 栈&#xff1a;栈中的生命周期是跟随线程&…

ncnn模型部署——使用VS2019把项目打包成DLL文件

一、项目打包成DLL文件 1.创建动态链接库DLL项目 创建完成&#xff0c;项目中包含源文件dllmain.cpp, pch.cpp&#xff0c;头文件framework.h, pch.h 2.编写和配置DLL项目 &#xff08;1&#xff09;配置pch.h文件&#xff0c;在头文件pch.h中定义宏&#xff0c;宏的作用的是…

VUE3给table的head添加popover筛选、时间去除时分秒、字符串替换某字符

1. VUE3给table的head添加popover筛选 <el-tableref"processTableRef"class"process-table"row-key"secuId":data"pagingData"style"width: 100%"highlight-current-row:height"stockListHeight":default-exp…

晶圆测试工艺介绍

第一章、晶圆测试简介 晶圆测试的方式&#xff0c;主要是通过测试机&#xff08;事先编好程序&#xff09;和探针台的联动&#xff0c;依靠探针卡的接触衔接&#xff0c;进行晶圆级的芯片测试。 当探针卡Probecard 的探针正确接触晶圆wafer 内一颗 芯片die的每个接触点bondpads…

毕设:《基于hive的音乐数据分析系统的设计与实现》

文章目录 环境启动一、爬取数据1.1、歌单信息1.2、每首歌前20条评论1.3、排行榜 二、搭建环境1.1、搭建JAVA1.2、配置hadoop1.3、配置Hadoop环境&#xff1a;YARN1.4、MYSQL1.5、HIVE(数据仓库)1.6、Sqoop&#xff08;关系数据库数据迁移&#xff09; 三、hadoop配置内存四、导…

网络层(1)——概述

一、概述 网络层毫无疑问是最复杂的一层&#xff0c;涉及到大量的协议与结构的内容。在如今主流的设计中&#xff0c;大家都会把网络层分成两个部分&#xff1a;数据平面、控制平面。其中数据平面指的是网络层中每台路由器的功能&#xff0c;它决定了到达路由器端口输入链路之一…

软考2018下午第六题改编逻辑(状态模式)

在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 package org.example.状态模式.软考航空;/*** author lst* date 2023年12月07日 15:37*/ class FrequentFlyer {CState state;double flyMiles;public FrequentFlyer() {…

为什么 AWS 数据库不讲 HTAP

在 AWS re:Invent 2023 掌门人 Adam Selipsky 的 Keynote 上&#xff0c;数据库方面最重磅的主题是 Zero-ETL&#xff0c;从 TP 数据库 (RDS, Aurora, DynamoDB) 同步数据到 AP 数据库 (Redshift)。 Zero-ETL 是 AWS 在去年 re:invent 2022 上推出的概念&#xff0c;今年则继…

Peter算法小课堂—贪心算法

课前思考&#xff1a;贪心是什么&#xff1f;贪心如何“贪”&#xff1f; 课前小视频&#xff1a;什么是贪心算法 - 知乎 (zhihu.com) 贪心 贪心是一种寻找最优解问题的常用方法。 贪心一般将求解过程分拆成若干个步骤&#xff0c;自顶向下&#xff0c;解决问题 太戈编程第…

simulink enable模块——使能子系统案例仿真分析

1.案例分析 仍以一个简单的乘法增益案例分析 分析&#xff1a;可以看到&#xff0c;在满足条件性才条用使能子系统&#xff0c;在t1s和3s时刻&#xff0c;进行增益操作&#xff0c;这和上篇博客中的触发trigger子系统相同的作用。 simulink trigger模块使用——多种调用案例分…

膜结构建筑:未来体育可持续发展的绿色引擎

随着城市化的飞速发展&#xff0c;现代建筑迫切需要创新性的解决方案&#xff0c;而膜结构建筑以其独特的设计理念和可持续性特点&#xff0c;正在成为未来城市发展的重要引擎。本文将深入探讨膜结构建筑在可持续城市发展中的关键作用&#xff0c;包括其在节能减排、资源有效利…

【Qt开发流程】之元对象系统

描述 Qt的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架的核心机制之一&#xff0c;它提供了运行时类型信息&#xff08;RTTI&#xff09;和信号与槽&#xff08;Signals and Slots&#xff09;机制的支持。元对象系统在Qt中扮演了很重要的角色&#xff0c;它…

C++STL的string类(一)

文章目录 前言C语言的字符串 stringstring类的常用接口string类的常见构造string (const string& str);string (const string& str, size_t pos, size_t len npos); capacitysize和lengthreserveresizeresize可以删除数据 modify尾插插入字符插入字符串 inserterasere…

解决WPS拖动整行的操作

如上图&#xff0c;想要把第4行的整行内容&#xff0c;平移到第1行。 1.选中第4行的整行 2.鼠标出现如图的样子时&#xff0c;按住鼠标左键&#xff0c;上移到第1行位置后&#xff0c;放开左键即可。

PPT设置章节

0 Preface/Foreward 1 添加章节方法 选择 > 开始 > 节 可以进行&#xff1a; 新增节重命名节删除所有节 相关节的内容如下&#xff1a;

vivado时序方法检查5

TIMING-14 &#xff1a; 时钟树上的 LUT 在时钟树上发现 LUT <cell_name> 。不建议在时钟路径上包含 LUT 单元。 描述 时钟路径上的 LUT 可能导致偏差过大 &#xff0c; 因为时钟必须在穿过互连结构的常规布线资源上进行布线。除偏差过大外 &#xff0c; 这些路径更…

【Java系列】函数式接口编程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【算法每日一练]-结构优化(保姆级教程 篇4 树状数组,线段树,分块模板篇)

除了基础的前缀和&#xff0c;后面还有树状数组&#xff0c;线段树&#xff0c;分块的结构优化。 目录 分块 分块算法步骤&#xff1a; 树状数组 树状数组步骤&#xff1a; 线段树点更新 点更新步骤&#xff1a; 线段树区间更新 区间更新步骤&#xff1a; 分块 分块算…