C++递推基本概念和基础知识

news2024/12/25 9:32:51

目录

一、递推的概念

什么是递推算法?

解决递推问题的一般形式 

二、递推和递归的区别

三、递推的实例


一、递推的概念

什么是递推算法?

“递推”是计算机解题的一种常用方法。利用“递推法”解题首先要分析归纳出“递推关系”如经典的斐波那契数列问题,用 f (i)表示第 i 项的值,则 f (1) =0,f(2) =1,在 n>2 时,存在递推关系:f (n) = f(n-1) + f(n-2)。
在递推问题模型中,每个数据项都与它前面的若干个数据项(或后面的若干个数据项)存在一定的关联,这种关联一般是通过一个“递推关系式”来描述的。求解问题时,需要从初始的一个或若干数据项出发,通过递推关系式逐步推进,从而推导计算出最终结果。这种求解问题的方法叫“递推法”。其中,初始的若干数据项称为“递推边界”

解决递推问题的一般形式 

  • 建立递推关系式
  • 确定边界条件(即初始值)
  • 递推求解

二、递推和递归的区别

  • 从程序上看,递归表现为自己调用自己,递推则没有这样的形式。
  • 递归是从问题的最终目标出发,逐渐将复杂问题化为简单问题,最终求得问题是逆向的。递推是从简单问题出发,一步步的向前发展,最终求得问题。是正向的。
  • 递归中,问题的n要求是计算之前就知道的,而递推可以在计算中确定,不要求计算前就知道n。
  • 一般来说,递推的效率高于递归(当然是递推可以计算的情况下)

三、递推的实例

1.超级楼梯

Description

有一个超级楼梯共N级,刚开始时你在第一级,若每次只能跨上一级或两级,要走上第N级,共有多少种走法?
其中N(1 <= N <= 105)。

Input

输入一个整数N

Output

输出走到第N级的方案数,答案可能会很大,结果模上2333333。

Sample Input

3

Sample Output

2

这个题是比较典型的递推。可以慢慢分析一下,对于n级台阶,假设有f[n]种走法,如果最后一步走1级那么剩下n-1级自然有f[n-1]种走法;如果最后一步走2级那么剩下n-2级就有f[n-2]种走法。总结出这个公式:

f[n]=f[n-1]+f[n-2]

故代码如下:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int i,j,n,a,f[100];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a);
        f[2]=1;f[3]=2;f[4]=3;
        for(j=4;j<=40;j++)
        {
            f[j]=f[j-1]+f[j-2];
        }
        printf("%d",f[a]);
        printf("\n");
    }
    return 0;
}

2.一只小蜜蜂

Description

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如图所示。

其中起点为a,终点为b(1 <= a < b <= 105)。

Input

两个整数a和b,表示蜜蜂的起点和终点。

Output

一个整数表示从起点a到达终点b的路线数,答案可能会很大,结果模上2333333。

Sample Input

2 4

Sample Output

2

仔细观察,其实就是上面的斐波那契数列,所以还是这个公式

f[n]=f[n-1]+f[n-2]

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll f[100000];
int main(){
	int n,m;
	cin >> n >> m;
	f[n] = 1;
	f[n + 1] = 1;
	f[n + 2] = 2;
	for(int i = n + 3;i <= m;i ++){
		f[i] = (f[i - 1] + f[i - 2]) % 2333333;
	}
	cout << f[m];
	return false;
} 

3.外星母牛的故事

Description

有一头外星母牛,它每年年初生一头外星小母牛。每头外星小母牛从第四个年头开始,每年年初也生一头外星小母牛。

请问在第N (1 <= N <= 105)年的时候,共有多少头外星母牛?(假如外星母牛可以永生​)

Input

输入一个整数N。

Output

输出一个整数,表示的N年的外星母牛总数,答案可能会很大,结果模上2333333。

Sample Input

6

Sample Output

9

本题明显可用递推来解决,从第五年开始,有其他的母牛开始生子,所以递推从5开始,每年的母牛总数就是上一年的母牛数目+新生母牛数,若用f[i]表示第i年母牛总数,则有f[i]=f[i-1]+f[i-3]

注意母牛在第4个年头生子,所以新生母牛数目应该是f[i-3],也就是i-3那年的母牛总数。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll f[100000];
int tmp = 2;
int main(){
	int m;
	cin >> m;
	f[1] = 1;
	f[2] = 2;
	f[3] = 3;
	f[4] = 4;
	f[5] = 6;	
	for(int i = 6;i <= m;i ++){
		f[i] = (f[i - 1] + f[i - 3]) % 2333333;
		
		//cout << f[i] << endl;
	}
	cout << f[m];
	return false;
} 

4.铺地板I

Description

有一个大小是 2 x N(1 <= N <= 105)的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设的方法。

Input

输入一个整数N,表示是一个2 * N的网格。

Output

输出一个整数,表示最终的铺设方案数,答案可能会很大,结果模上2333333。

Sample Input

1

Sample Output

1

可以使用动态规划来解决这个问题。设f[i]表示2 x i网格的铺设方案数,注意到最后一列可能由1个2 x 1的骨牌或者1个2 x 2的骨牌组成。如果最后一列是2 x 1的骨牌,则前面的列可以任意铺设,此时方案数为f[i-1]。如果最后一列是2 x 2的骨牌,则倒数第二列也必须是2 x 2的骨牌,前面的列可以任意铺设,此时方案数为f[i-2]。

因此有递推式:f[i] = f[i-1] + 2 * f[i-2]

边界条件f[1] = 1,f[2] = 2

注意:最后答案要取模2333333

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll f[100005];
int main(){
	ll m;
	cin >> m;
	f[1] = 1;
	f[2] = 3;
	for(ll i = 3;i <= m;i ++){
		f[i] = (f[i - 1] + 2 * f[i - 2]) % 2333333;
		//cout << f[i] << endl;
	}
	cout << f[m];
	return false;
} 

5.[NOIP2002]过河卒 T4

Description

如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。

棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。

Input

B点的坐标(n,m)以及对方马的坐标(X,Y)

Output

一个整数(路径的条数)。

Sample Input

6 6 3 2

Sample Output

17

我们定义状态dp[][]为卒子走到坐标(i,j)时能走的条数

如果不考虑马的控制,i,j) 点的路径条数等于它上面和左边的路径条数之和,即

dp[i][j]=dp[i-1][j]+dp[i][j-1]

我们这道题中要考虑马的位置,当卒子走到马的控制点时,我们跳过这个点,让这个点还为0,不会影响控制点下边和左边的dp[][],这样我们就可以继续计算其他点的dp[][]的值了。

#include<bits/stdc++.h>
#define maxn 110
using namespace std;
int main()
{
	bool b[maxn][maxn];
	long long a[maxn][maxn];
	memset(b,0,sizeof(b));
	int dx[8]={2,1,-1,-2,-2,-1,1,2};
	int dy[8]={1,2,2,1,-1,-2,-2,-1};
	int n,m,x,y;
	cin>>n>>m>>x>>y;
	b[x][y]=1;
	for(int i=0;i<=7;i++)
	if(x+dx[i]>=0&&x+dx[i]<=n&&y+dy[i]>=0&&y+dy[i]<=m)
	b[x+dx[i]][y+dy[i]]=1;
	int k=0;
	while(!b[k][0]&&k<=n)
		 
		{
			a[k++][0]=1;
		} 
		int l=0;
 
		while(!b[0][l]&&l<=m)
			{
				a[0][l++]=1;
			}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(b[i][j]) a[i][j]=0;
					else {a[i][j]=a[i-1][j]+a[i][j-1];
						a[i][j]=a[i-1][j]+a[i][j-1];} 
		cout<<a[n][m];
	return 0;
}

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

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

相关文章

MIT 6.824 lab distributed system 分布式系统(1)----lab1 MapReduce

https://youtu.be/cQP8WApzIQQ 概念 为什么需要分布式系统&#xff1f; high performanceparallelism&#xff1a;分布式系统可以实现CPU、内存、硬盘的并行运行fault tolerancephysical&#xff1a;security / isolated 分布式系统的困难 concurrency&#xff1a;各个并行的…

【观察】金融行业决策智能化“换挡提速” 华为全球智慧金融峰会2023值得期待...

当前以数字化、智能化为特征的第四次工业革命正“扑面而来”&#xff0c;数字经济浪潮对各行各业都产生着深刻影响。其中&#xff0c;金融行业作为现代经济的核心&#xff0c;也面临着一系列重大的挑战和机遇。 相比于其他企业&#xff0c;金融行业依靠数据分析和智能决策更好地…

某公司招了一个大专生,候选人要一万月薪,HR给申请一万二,HR领导说:给一万三!...

无良公司看多了&#xff0c;不禁让人怀疑&#xff1a;这个世界上还有好公司和好hr吗&#xff1f; 来看看这位hr的故事&#xff1a; 最近我们招了一个大专生&#xff0c;5年经验。他的工资是7000&#xff0c;候选人想要10000&#xff0c;我给申请了12000&#xff0c;结果审批不通…

用于分析脉冲类信号的二阶瞬态提取变换研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【TCP/IP】基于TCP的服务器端/客户端 II - 迭代服务器/客户端的概念与实现

1. 迭代服务器端/客户端 1.1 迭代服务器实现 1.2 迭代回声服务器端/客户端 2 回声客户端存在的缺陷 1. 迭代服务器端/客户端 在此之前&#xff0c;让我们先补充一个“回声服务器/客户端”的概念。回声&#xff08;echo&#xff09;服务器/客户端是指服务器端将客户端传输的字…

干货 | 郭晓雷:数智安全监管机制研究与思考

作者&#xff1a;郭晓雷本文约4300字&#xff0c;建议阅读8分钟 本文报告的主要内容关于数据安全&#xff0c;从学术或者技术的角度&#xff0c;更多地认为人工智能是数据处理的新技术&#xff0c;其应用会产生更加丰富的数据处理活动场景。 郭晓雷&#xff1a;今天报告的主要内…

【U8+】用友U8查询出库汇总表没有“计量单位”列

【问题描述】 在用友U8软件中&#xff0c; 查询存货核算模块下的【出库汇总表】后&#xff0c; 没有【计量单位】列&#xff0c; 但是汇总依据中&#xff0c;可以明显看到是包含“计量单位”的。 【解决方法】 首先明确一点&#xff0c;在查询条件中的【汇总依据及排序方式】…

可再生能源的不确定性和储能系统的时间耦合的鲁棒性和非预期性区域微电网的运行可行性研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

4.Python高频函数—数据分割split()

这里是针对dataframe 的数据的列中的字符串进行分割、分列&#xff0c;首先需要先用.str将这一列转换为类似字符串的格式&#xff0c;然后再使用split()方法。 Part.1 split()函数 根据分隔符或正则表达式对字符串进行拆分&#xff1b;返回数据框&#xff08;DataFrame&#x…

位运算总结

位运算 有符号整数无符号整数位移运算 1计算机中数字的表示 计算机只有0&#xff0c;1两个数字&#xff0c;所以我们常用的10进制计算 所以我们需表示10进制 要使用二进制来表示10进制数 进制表示法 我们假设一个 8 位的数据类型 方案1 2&#xff1a;0000 0010 我们会发现…

FPGA 的数字信号处理:Verilog 实现简单的 FIR 滤波器

该项目介绍了如何使用 Verilog 实现具有预生成系数的简单 FIR 滤波器。 绪论 不起眼的 FIR 滤波器是 FPGA 数字信号处理中最基本的模块之一&#xff0c;因此了解如何将具有给定抽头数及其相应系数值的基本模块组合在一起非常重要。因此&#xff0c;在这个关于 FPGA 上 DSP 基础…

FPGA驱动FT601实现USB3.0通信测速试验 提供工程源码和QT上位机源码

目录 1、前言2、FT601芯片解读和时序分析FT601功能和硬件电路FT601读时序解读FT601写时序解读 3、我这儿的 FT601 USB3.0通信方案4、vivado工程详解5、上板调试验证6、福利&#xff1a;工程代码的获取 1、前言 目前USB3.0的实现方案很多&#xff0c;但就简单好用的角度而言&am…

【见微知著】Android Jetpack - Navigation的架构设计

前言&#xff1a;人总是理所当然的忘记&#xff0c;是谁风里雨里&#xff0c;一直默默的守护在原地。 前言 Navigation 作为 Android Jetpack 组件库中的一员&#xff0c;是一个通用的页面导航框架。为单 Activity 架构而生的端内路由导航&#xff0c;用来管理 Fragment 的切换…

使用IDEA使用Git:Git使用指北——实际操作篇

Git使用指北——实际操作 &#x1f916;:使用IDEA Git插件实际工作流程 &#x1f4a1; 本文从实际使用的角度出发&#xff0c;以IDEA Git插件为基座讲述了如果使用IDEA的Git插件来解决实际开发中的协作开发问题。本文从 远程仓库中拉取项目&#xff0c;在本地分支进行开发&…

数据结构-Redis(一)

Redis除了性能强外&#xff0c;还有数据结构丰富多彩。 一、String 单值缓存 SET key value GET key 存对象 相信大家都存过&#xff0c;我们一般都是把对象value转json&#xff0c;获取的时候&#xff0c;再json转对象 SET user:1 value(json值) 但当我们需要对对象某…

推荐一款可匹敌国际大厂的国产企业级低无代码平台

文章目录 前言&#xff1a;亟待转型的软开创业者什么是低/无代码居高不下的企业级软件搭建成本1. 开发周期较长2. 在需求明确、软件修改、系统集成等方面存在多种卡点3. 数据管理混乱 无代码/低代码开发&#xff0c;时代的潮流无代码平台 smardaten1. smardaten 简介2. smardat…

ATK-MD0096-V21使用手册

ATK-0.96’ OLED_V2.0(V2.0 是版本号&#xff0c;下面均以 OLED 表示该产品)是 ALIENTEK 推出的一款高性能 OLED 显示模块&#xff0c;&#xff0c;尺寸小巧&#xff08;27mm26mm&#xff09;&#xff0c;结构紧凑&#xff0c;模块通过一个28P的排针与外部连接。 8080并口模式…

「Win」Windows环境变量介绍与操作

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「Win」Windows程序设计 相关术语 Windows环境变量&#xff1a;是一组用于存储系统和应用程序配置信息的变量&#xff0c;在Windows操作系统中起着非常重要的作用。本文将详细介绍Windows环境变量的概…

机器学习常识 22: 循环神经网络

摘要: 循环神经网络 (Recurrent Neural Network, RNN) 用于处理序列数据. 本贴以前的算法, 我都用 Java 代码实现过. 很遗憾, 从本贴开始, 就只知道一点概念了. 1. 动机 序列数据中, 前后数据之间不是独立的, 而是会产生上下文影响. 如: 文本, 机器翻译一个句子的时候, 不是…

寻访 | 北京量子信息研究院

前言&#xff1a;为了普及科学技术知识、传播科学思想&#xff0c;光子盒特开启「寻访」专栏&#xff0c;带领各位读者探访全球的量子工厂和实验室。 2023年5月30日下午&#xff0c;为期6天的“2023中关村论坛主会期”落下帷幕。 量子计算、区块链、脑机接口、新能源材料——围…