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

前言

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

一、斐波那契数列

斐波那契数 (通常用 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.hqwc.cn/news/522647.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【考研数学】李林《880》vs 李永乐《660》完美使用搭配

没有说谁一定好&#xff0c;只有适不适合自身情况&#xff0c;针对自身弱点选择性价比才最高。 两者侧重点不同&#xff0c;660适合强化前期&#xff0c;弥补基础的不足&#xff0c;880适合强化后期&#xff0c;题型全面&#xff0c;提高我们对综合运用知识的能力。 选择习题…

B端系统优化,可不是换个颜色和图标,看看与大厂系统的差距。

Hi&#xff0c;我是贝格前端工场&#xff0c;优化升级各类管理系统的界面和体验&#xff0c;是我们核心业务之一&#xff0c;欢迎老铁们评论点赞互动&#xff0c;有需求可以私信我们 一、不要被流于表面的需求描述迷惑。 很多人找我们优化系统界面&#xff0c;对需求总是轻描淡…

7-4 哲哲打游戏(Python)

哲哲是一位硬核游戏玩家。最近一款名叫《达诺达诺》的新游戏刚刚上市&#xff0c;哲哲自然要快速攻略游戏&#xff0c;守护硬核游戏玩家的一切&#xff01; 为简化模型&#xff0c;我们不妨假设游戏有 N 个剧情点&#xff0c;通过游戏里不同的操作或选择可以从某个剧情点去往另…

软件功能鉴定

软件鉴定 &#xff0c;软件功能鉴定&#xff0c;软件质量鉴定 软件产品质量鉴定&#xff1a;对于各种APP&#xff0c;软件&#xff0c;系统进行鉴定。

【PCIe】TLP结构与配置空间

&#x1f525;博客主页&#xff1a;PannLZ 文章目录 PCIe TLP结构PCIe配置空间和地址空间 PCIe TLP结构 TLP 主要由3个部分组成&#xff1a; Header 、 数据(可选&#xff0c;取决于具体的TLP 类 型 ) 和 ECRC (End to End CRC, 可选)。TLP 都始于发送端的事务层&#xff0c;终…

乐得瑞的一拖二100W智能分配方案更加成熟

在快节奏的现代生活中&#xff0c;手机不仅是通讯工具&#xff0c;更是我们工作、学习和娱乐的得力助手。然而&#xff0c;手机的电量问题一直是困扰我们的难题。为了解决这一问题&#xff0c;市场上应运而生了一种名为“一拖二快充线”的充电设备。它集快速充电与独特设计于一…

基于STM32的展馆火灾监控系统的设计与实现

自从人类学会用火后&#xff0c;火灾就开始伴随人类了&#xff0c;几千年来火灾对人类造成的损失不可谓不大&#xff0c;但究其原因&#xff0c;除了人为纵火、放火之外&#xff0c;其他火灾都是在人们没有注意或没有检测到才产生的&#xff0c;所以防火的重要方面仍是防患于未…

蓝桥杯每日一题:烤鸡dfs

这道题考察了dfs的应用&#xff0c;题干十分有趣&#xff0c;思考过程对以后类似题目也有很强的参考性&#xff0c;一起来学习吧&#xff01; 题目&#xff1a; # 烤鸡 ## 题目背景 猪猪 Hanke 得到了一只鸡。 ## 题目描述 猪猪 Hanke 特别喜欢吃烤鸡&#xff08;本是同畜…

本鲸多方位助力创业者高效对接创新创业机遇

在科技创新的浪潮中&#xff0c;创业者们不断探索着新的商业机会&#xff0c;寻求着创新创业的道路。然而&#xff0c;面对复杂多变的市场环境和激烈的竞争压力&#xff0c;如何高效对接创新创业机遇成为了摆在创业者面前的重要课题。 本鲸依托海南本鲸投资有限公司和重庆本鲸…

Leetcode - 周赛387

目录 一&#xff0c;3069. 将元素分配到两个数组中 I 二&#xff0c;3070. 元素和小于等于 k 的子矩阵的数目 三&#xff0c;3071. 在矩阵上写出字母 Y 所需的最少操作次数 四&#xff0c;3072. 将元素分配到两个数组中 II 一&#xff0c;3069. 将元素分配到两个数组中 I 本…

给一篇word注音可不可以只要拼音不要汉字 word中如何只保留拼音不要汉字

word中如何只保留拼音不要汉字&#xff0c;如果你想要只保留拼音而去除汉字&#xff0c;可以通过一系列步骤来实现。以下是一个详细的教程&#xff0c;帮助你完成这个任务。 首先&#xff0c;确保你的电脑已经安装了“汇帮注音大师”软件。如果没有&#xff0c;你需要安装一下…

异常-Exception

文章目录 异常-Exception常见的运行时异常NullPointerException&#xff08;空指针异常&#xff09;ArithmeticException&#xff08;数学运算异常&#xff09;ArrayIndexOutOfBoundsException&#xff08;数组下标越界异常&#xff09;ClassCastException&#xff08;类型转换…