【算法集训】基础算法:递推 | 概念篇

前言

递推最通俗的理解就是数列,递推和数列的关系就好比 算法 和 数据结构 的关系,数列有点像数据结构中的顺序表,而递推就是一个循环或者迭代的枚举过程。
递推本质上是数学问题,所以有同学问算法是不是需要数学非常好,也并不是,你会发现,这些数学只不过是初中高中我们学烂的东西,高考都经历了,这些东西又何足为惧!?

一、斐波那契数列

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1,给定 n(0 ≤ n ≤ 30) ,请计算 F(n) 。

拿到这个题目,我们首先来看题目范围, 最多不超过 30,那是因为斐波那契数的增长速度很快,是指数级别的。所以如果 n 很大,就会超过 c语言 中32位整型的范围。这是一个最基础的递推题,递推公式都已经告诉你了,我们要做的就是利用一个循环来实现这个递推。
我们只需要用一个 F[31] 数组,初始化好 F[0] 和 F[1],然后按照给定的公式循环计算就可以了。像这样:

int fib(int n) {
int i; // (1)
int F[31] = {0, 1}; // (2)
for(i = 2; i <= n; ++i) { // (3)
F[i] = F[i-1] + F[i-2]; // (4)
}
return F[n]; // (5)
}
  1. (1) 首先定义一个循环变量;
  2. (2) 再定义一个数组记录斐波那契数列的第 n 项,并且初始化第 0 项 和 第 1 项。
  3. (3) 然后一个 for 循环,从第 2 项开始;
  4. (4) 利用递推公式逐步计算每一项的值;
  5. (5) 最后返回第 n 项即可。

二、泰波那契数列

泰波那契序列 Tn 定义如下:
T(0) = 0, T(1) = 1, T(2) = 1
且在 n > 2 的条件下 T(n) = T(n-1) + T(n-2) + T(n-3),给你整数 n,请返回第 n 个泰波那契数 T(n) 的值。
如果已经理解斐波那契数列,那么这个问题也不难,只不过初始化的时候,需要初始化前三个数,并且在循环迭代计算的时候,当前数的值需要前三个数的值累加和。像这样:

int tribonacci(int n){
int T[100];
T[0] = 0;
T[1] = 1;
T[2] = 1;
for(int i = 3; i <= n; ++i) {
T[i] = T[i-1] + T[i-2] + T[i-3];
}
return T[n];
}

三、斐波那契数列变形

给定一个 n(1 ≤ n ≤ 45) 代表总共有 n 阶楼梯,一开始在第 n 阶,每次可以爬 1 或者 2 个台阶,问总共有多少种不同的方法可以爬到楼顶。

我们定义一个数组 f[46],其中 f[i] 表示从第 0 阶爬到第 i 阶的方案数。由于每次可以爬 1 或者 2 个台阶,所以对于第 i 阶楼梯来说,所以要么是从第 i-1 阶爬过来的,要么是从 i-2 阶爬过来的,如图所示:

于是得出一个递推公式:f[i] = f[i-1] + f[i-2]
我们发现这个就是斐波那契数列,你可以叫它递推公式,也可以叫它状态转移方程。这里的 f[i] 就是状态的概念,从一个状态到另一个状态就叫状态转移。
当然我们还要考虑初始状态,f[0] 代表从第 0 阶到第 0 阶的方案数,当然就是 1 啦,f[1] 代表从第 0 阶到第 1 阶的方案数,由于只能走 1 阶,所以方案数也是 1。
代码就不再累述了。

四、二维递推问题

像斐波那契数列这种问题,是一个一维的数组来解决的,有些时候,一维解决不了的时候,我们就需要升高一个维度来看问题了。
长度为 n(1≤n<40) 的只由 ‘A’、‘C’、'M’三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符)且禁止出现 M 相邻的情况,问这样的串有多少种?
考虑长度为 n,且以 ‘A’ 结尾的串有 f[n][0] 种、以 ‘C’ 结尾的串有 f[n][1] 种、以 ‘M’ 结尾的串有 f[n][2] 种,那么我们要求的答案就是:

想一下怎么进行递推???
如果第 n 个结尾的字符是 ‘A’ 或者 ‘C’,那么显然, 第 n−1 个字符可以是任意字符;而如果第 n 个结尾的字符是 ‘M’,那么第 n−1 个字符只能是是 ‘A’ 或者 ‘C’。所以可以得到递推公式如下:

到这一步,我们就可以利用程序求解了,但是,还可以化解,由于
于是,可以得出:

从而得到:



原式可以化解为如下递推式(升维再降维):

然后我们手动算出长度为 1 和 长度为 2 的串的方案数,递推代码如下:

long long getACM(int n) {
long long g[40];
g[1] = 3, g[2] = 8;
for(i = 3; i <= n; i++) {
g[i] = 2 * (g[i-1] + g[i-2]);
}
return g[n];
}

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

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

相关文章

250+可用的 AI 资源网站

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 这里是关于AI网站的一份资源列表。欢迎访问该链…

Linux系统文件管理和查询指令

文章目录 前言一、linux文件系统简介二、windows和Linux下文件系统的对比1.windows文件系统2.Linux文件系统 三、Linux下文件系统的操作指令文件类型 前言 &#x1f4a6; 操作系统最重要的功能之一就是数据的处理和存储。处理这些相应的数据&#xff0c;就需要相应的操作规范或…

edm邮件是什么意思:与普通邮件有何不同?

edm邮件是什么意思&#xff1f;如何优化邮件内容以提高转化率&#xff1f; edm邮件因其独特的营销价值而备受关注。那么&#xff0c;edm邮件究竟是什么意思呢&#xff1f;它与普通邮件又有哪些不同呢&#xff1f;下面&#xff0c;AokSend就来为大家介绍一下。 edm邮件的概念与…

2024年视频号带货蓝海项目真的可做吗?

在数字经济的浪潮下&#xff0c;视频号带货作为一种新兴的电商模式&#xff0c;近年来备受瞩目。随着5G技术的普及和移动设备的更新换代&#xff0c;视频平台用户规模持续增长&#xff0c;为视频号带货提供了广阔的舞台。然而&#xff0c;面对2024年这个未来节点&#xff0c;我…

RuntimeError: dimension specified as 0 but tensor has no dimensions

解决办法 使用view方法改变维度为1&#xff0c;如target target.view(-1),这样假如原来target是1,使用后变为[1],维度从None变为1. Problem Sovled.

阿里云服务器计算型、通用型、内存型各实例计算、存储等性能介绍

在阿里云目前的活动中&#xff0c;属于计算型实例规格的云服务器有计算型c7、计算型c7a、计算型c8a、计算型c8y这几个实例规格&#xff0c;属于通用型实例规格的云服务器有通用型g7、通用型g7a、通用型g8a、通用型g8y&#xff0c;属于内存型实例规格的云服务器有内存型r7、内存…

AIOps 智能运维:有没有比专家经验更优雅的错/慢调用分析工具?

作者&#xff1a;图杨 工程师小 A 刚刚接手他们公司最核心的电商系统的运维工作&#xff0c;小 A 发现&#xff0c;在生产环境中&#xff0c;系统明明运行得非常稳定&#xff0c;但是总会出现一些“诡异”的情况。比如&#xff1a; 偶尔会一些错误调用&#xff0c;但是&#…

虹科Pico汽车示波器 | 免拆诊断案例 | 2015 款路虎神行者车熄火后散热风扇依旧高速运转

一、故障现象 一辆2015款路虎神行者车&#xff0c;搭载2.2 L发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;车辆熄火后&#xff0c;散热风扇依旧高速运转&#xff0c;且无法停止。 二、故障诊断 接车后首先试车&#xff0c;故障现象的确存在。使用故障检…

相机安装位置固定后开始调试设备供电公司推荐使用方法

摄像头安装位置固定后开始调试 设备供电&#xff1a;无电源设备需要连接12V/2A电源并连接到摄像机的DC端口&#xff0c;而有电源的摄像机可以直接连接到220V电源。 连接设备&#xff1a;如果是有线连接&#xff0c;请使用网线将设备连接到电脑&#xff08;建议直接连接&#…

H5简约星空旋转引导页源码

源码名称&#xff1a;H5简约星空旋转引导页 源码介绍&#xff1a;一款带有星空旋转背景特效的源码&#xff0c;带有四个按钮 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/11655.html

H5自适应程序员个人主页源码

H5自适应程序员个人主页源码 源码名称&#xff1a;自适应程序员个人主页源码 源码介绍&#xff1a;一款自适应程序员个人主页源码&#xff0c;带有4个页面&#xff0c;分别对应首页、个人技能页、我的朋友页【也可改为的我站点】、联系我页面。 需求环境:H5 下载地址&#x…

【数据结构】二叉树的层序遍历、前序遍历,中序遍历、后续遍历

目录 一、前言二、二叉树的遍历概念三、根据遍历结果去推其他的遍历结果1.根据前序遍历、中序遍历&#xff0c;求后序遍历2. 已知中序和后序遍历&#xff0c;求前序遍历 四、代码实现 一、前言 最近也是在准备笔试&#xff0c;由于没有系统的学过数据结构&#xff0c;所以花了…

YOLOV5添加 ECA CA SE CBAM 等八种注意力机制(小白可用)

目录 CBAM注意力机制原理及代码实现 代码实现 yaml文件 修改后的结构图 SE注意力机制 SE结构图 完整代码实现 报错 ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&…

【考研数学】打基础 - 武忠祥《基础篇》vs 李永乐《复习全书》

这个我太有同感了&#xff0c;但是我现在能分清了&#xff0c;绝对给大家讲明白 大家疑惑的是&#xff0c;武忠祥老师的基础阶段为什么有人推荐高等数学基础篇&#xff0c;有人推荐复习全书。所以到底该用哪一个。 其实这是因为武忠祥老师在两个机构干过&#xff0c;在有道的…

前端之用HTML弄一个古诗词

将进酒 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>将进酒</title><h1><big>将进酒</big> 君不见黄河之水天上来</h1><table><tr><td ><img…

C#无法给PLC写入数据原因分析

一、背景 1.1 概述 C#中无法给PLC写入数据的原因有很多&#xff0c;这里分享网络端口号被占用导致无法写入的确认方法 1.2 环境 ①使用三菱PLC ②C#通过网口与PLC进行通讯 二、现象 1.1 代码 通过HslCommunication连接PLC时&#xff0c;连接返回成功&#xff0c;写入返回失败 …

了解O2OA(翱途)开发平台中的VIP应用

使用O2OA(翱途)开发平台可以非常方便地进行项目的业务需求开发与实施&#xff0c;O2OA(翱途)开发平台并不限制实现的系统类型&#xff0c;所以能实现的系统很多&#xff0c;最终呈现的项目成果也是多样性的&#xff0c;可能是OA系统&#xff0c;可能是人力资源管理系统&#xf…

AI写作,一键生成原创文章真高效

AI写作&#xff0c;一键生成原创文章真高效!在当今信息爆炸的时代&#xff0c;写作已成为一项重要的技能。然而&#xff0c;对于许多人来说&#xff0c;写作并不容易。有时我们会面临写作灵感枯竭、时间不足或者缺乏写作能力的困扰。但是&#xff0c;随着人工智能技术的不断进步…

3、设计模式之工厂模式2(Factory)

一、什么是工厂模式 工厂模式属于创建型设计模式&#xff0c;它用于解耦对象的创建和使用。通常情况下&#xff0c;我们创建对象时需要使用new操作符&#xff0c;但是使用new操作符创建对象会使代码具有耦合性。工厂模式通过提供一个公共的接口&#xff0c;使得我们可以在不暴露…

TS271IDT运算放大器芯片中文资料PDF数据手册引脚图图片参数价格功能

产品描述&#xff1a; TS271 是一款低成本、低功耗的单通道运算放大器&#xff0c;设计用于采用单电源或双电源供电。该运算放大器采用意法半导体硅栅CMOS工艺&#xff0c;具有出色的消耗-速度比。该放大器非常适合低功耗应用。 电源可通过引脚 8 和 4 之间连接的电阻器进行外…