OJ刷题 第十六篇(递推较多,难)

news2024/11/27 19:41:26

31012 - 贴瓷砖

时间限制 : 1 秒

内存限制 : 32 MB

有一块大小是 2 * n 的墙面,现在需要用2种规格的瓷砖铺满,瓷砖规格分别是 2 * 1 和 2 * 2,请计算一共有多少种铺设的方法。

输入

输入的第一行包含一个正整数T(T<=20),表示一共有T组数据,接着是T行数据,每行包含一个正整数N(N<=30),表示墙面的大小是2行N列。

输出

输出一共有多少种铺设的方法,每组数据的输出占一行。

样例

输入

3
2
8
12

输出

3
171
2731

 答案:

#include<iostream>
using namespace std;
int main() {
	int T = 0;
	cin >> T;
	int num = 0;
	while (T) {
		long long f1 = 1, f2 = 3,f3=0;
		cin >> num;
		if (num == 1) {
			f3 = f1;
		}
		else if (num == 2) {
			f3 = f2;
		}
		else {
			for (int i = 3; i <= num; i++) {
				f3 = 2*f1 + f2;
				f1 = f2;
				f2 = f3;
			}
		}
		cout << f3 << endl;
		T--;
	}
	return 0;
}

分析:如果你之前见到过这个题的话其实不难,但是如果第一次见,还是有点难度的。下面我们开始分析:

如果是2*1的瓷砖,很显然只有一种贴法,那就是用一块2*1的砖贴即可,记f1=1

如果是2*2,为什么有三种呢?一种就是直接用一块2*2的砖贴,第二种就是用两块2*1的砖横着贴,既然可以横着贴,那么就可以竖着贴,因此第三种就是用两块2*1竖着贴。共三种。记f2=3

如果是2*3,还要一个一个分析么?不用了,我们知道2*3,前面的2*2用一块2*2的瓷砖贴,剩下的用一块2*1的砖贴,因此贴法就是2*2的贴法种数,共3种,

如果前2*2用2*1的瓷砖来贴,那么显然就只能用2*1的砖横着贴或者竖着贴,因此有2*f1种,共f2+2*f1种,因此f3=f2+f1*2.这个递推式第一次推倒还是有点难度的,很多人不会想到那个瓷砖除了横着贴,还能竖着贴。这是本题的一个核心。

是否通过:

31013 - 统计方案

时间限制 : 1 秒

内存限制 : 32 MB

在一无限大的二维平面中,我们做如下假设:

1、每次只能移动一格;

2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);

3、走过的格子立即塌陷无法再走第二次。

求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。

输入

首先给出一个正整数C,表示有C组测试数据。

接下来的C行,每行包含一个整数n(n<=20),表示要走n步。

输出

请编程输出走n步的不同方案总数; 每组的输出占一行。

样例

输入

2
1
2

输出

3
7

答案:

#include<iostream>
using namespace std;
int main() {
	int N;
	cin >> N;
	int num;
	while (N) {
		cin >> num;
		long long f1 = 3, f2 = 7, f3 = 0;
		if (num == 1) {
			f3 = f1;
		}
		else if (num == 2) {
			f3 = f2;
		}
		else {
			for (int i = 3; i <= num; i++) {
				f3 = 2 * f2 + f1;
				f1 = f2;
				f2 = f3;
			}
		}
		cout << f3 << endl;
		N--;
	}
	return 0;
}

分析:本题的核心是推倒出那个递推关系,这个是不太容易直接看出来的,递推公式是

f(n)=2*f(n-1)+f(n-2)

可以在图上画出来看看,我画一个f(3)的情况:

 

其中黑色为n==1时时的走法,有3种,

红色为n==2 时的走方法,有7种

蓝色为n==3时的走法,有17总,不难看出,17=3+2*7,那个就是顶端的3种走法,两边都是7,则2*7.因此可以类推:

f(n)=2*f(n-1)+f(n-2)

 是否通过:

 31014 - 小明的烦恼(推导难度大)

时间限制 : 1 秒

内存限制 : 32 MB

小明最近新买了一个房间,为了给它做装修,想要给它铺上地砖。然而现有的地砖只有两种规格分别为1米*1米2米*2米,由于小明买的房间有点小,宽度只有3米,长度为N米。当然这样一个房间也足够他自己一个人住了。那么如果要给这个房间铺设地砖,且只用以上这两种规格的地砖,请问有几种铺设方案。

输入

输入的第一行是一个正整数C,表示有C组测试数据。接下来C行,每行输入一个正整数n(1<=n<=30),表示房间的长度。

输出

对于每组输入,请输出铺设地砖的方案数目。

样例

输入

2
2
3

输出

3
5

答案:

#include<iostream>
using namespace std;
int main() {
	int N;
	cin >> N;
	int ans = 0;
	while (N) {
		cin >> ans;
		long long  f1 = 1, f2 = 3, f3 = 0;
		if (ans == 1) {
			f3 = 1;
		}
		else if (ans == 2) {
			f3 = 3;
		}
		else {
			for (int i = 3; i <= ans; i++) {
				f3 = f2 + 2 * f1;
				f1 = f2; 
				f2 = f3;
			}
		}
		cout << f3 << endl;
		N--;
	}
	
	return 0;
}

 分析:这个题和前面那个贴瓷砖是一个类型的题目,但是又有区别。开始分析:

当N=1时,很显然,这个时候只有一种方法。即只能用1*!的砖,即f1=1

当N=2时,全部用1*1,是一种,前面2*2的格子用2*2的砖贴,后面的用1*1的砖贴,或者后面2*2的格子用2*2的砖贴,共2种,一共3种,即f2=3,贴法如下:

 

 

当N=3时,这个时候,就得靠推导了,看下图:

 

最后一行行贴1*1,那么剩下的就是3*2的贴法。 因此有f2种 。

 最后两行有两种贴法,仔细观察你,是2*1种,因此共f3=f2+2*f1种,以此类推。。f(n)=f(n-1)+2*f(n-2)。

 是否通过:

 

31015 - 十进制数转换成八进制(递归升级版)

时间限制 : 1 秒

内存限制 : 128 MB

递归算法,把任一给定的十进制正整数转换成八进制数输出。

输入

一个正整数,表示需要转换的十进制数。

输出

一个正整数,表示转换之后的八进制数。

样例

输入

15

输出

17

答案:

 

#include<iostream>
using namespace std;

void f(int N) {
	if (N < 8) {
		cout << N;
	}
	else {
		f(N / 8);
		cout << N % 8;
	}
}
int main() {
	int N;
	cin >> N;
	f(N);
	return 0;
}

分析:要说实现十进制转八进制其实不难,但是要用递归实现就比较难了。在以前我们就知道通过短除法来求进制之间的转换。如下图,

 当这个数小于8时,从该数开始,从下往上打印余数,就得了8进制数,其他进制数也是如此。

因此递归条件就是:

N<8时开始打印,

N>8时,除以8,然后打印它与8的余数。

这个递归看似简单,第一次还是很难写出来的,一定要掌握递归条件,才能写出来。 

 

31016 - 小明养猪的故事(昆虫繁殖简化版)

时间限制 : 1 秒

内存限制 : 128 MB

话说现在猪肉价格这么贵,小明也开始了养猪生活。说来也奇怪,他养的猪一出生第二天开始就能每天中午生一只小猪,而且生下来的竟然都是母猪。
不过光生小猪也不行,小明采用了一个很奇特的办法来管理他的养猪场:
对于每头刚出生的小猪,在它生下第二头小猪后立马被杀掉,卖到超市里。
假设在创业的第一天,小明只买了一头刚出生的小猪,请问,在第N天晚上,小明的养猪场里还存有多少头猪?

输入

测试数据的第一行是一个正整数T,代表测试数据的个数。接下来有T组测试,每组测试数据占一行,分别是一个正整数N,代表小明创业的第N天。(0<N<20)

输出

对于每组数据,请在一行里输出第N天晚上养猪场里猪的数目。

样例

输入

2
2
3

输出

2
3

答案:

#include<iostream>
using namespace std;
int main() {
	int T;
	cin >> T;
	int a[20] = { 0,1,2,3 };//第i天晚上猪的总数
	int b[20] = { 0,0,1,2 };//第i天新出生猪的数量
	int c[20] = { 0,0,0,1};//第i天杀猪的数量
	for (int i = 4; i <= 20; i++) {
		b[i] = a[i - 1];
		c[i] = b[i - 2];
		a[i] = a[i - 1] + b[i] - c[i];
	}
	int n;
	while (T) {
		cin >> n;
		cout << a[n] << endl;
		T--;
	}
	return 0;
}

 分析:这个题跟前面的昆虫繁殖那个题很像,但是比那个题简单很多。我们只需知道,正道题求第i天猪的总数跟什么有关即可。

先看一张表:

第几天1234
猪的总数1235
新出生的猪0123
杀猪的数量0011

我想已经发现规律了,第i天猪的总数只跟前一天猪的总数和前两天新生猪的总数有关:

第i天猪的总数 = 前一天猪的总数 + 第i天新出生猪的总数 — 第i天杀猪的总数

其中第i天新出生猪的总数=第i-1天猪的总数

第i天杀猪的总数=前i-2天新出生猪的总数

 设a[i]表示第i天晚上猪的总数,b[i]表示第i天新出生猪的总数,c[i]表示第i天杀猪的数量,则a[i]=a[i-1]+b[i]-c[i];

b[i=a[i-1];

c[i]=b[i-2];//因为每头猪过两天生了两头猪后就要被杀。

但是这么写有问题,我们应该先算出第i天新出生猪的总数和第i天杀猪的总数,再计算,因此正确计算为:

b[i=a[i-1];

c[i]=b[i-2];

a[i]=a[i-1]+b[i]-c[i];

通过答案发现,这个题是一个递推,f(n)=f(n-1)+f(n-2),但是肯定不能一下子看出来,要理清题目意思,根据题目意思来计算。

是否通过:

 

 

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

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

相关文章

第十三章 使用DHCP动态管理主机地址

文章目录 第十三章 使用DHCP动态管理主机地址一、动态主机地址管理协议1、DHCP简介2、DHCP常见术语 二、部署DHCP服务程序1、安装DHCP服务程序2、配置文件参考模板3、dhcpd服务程序配置文件中常见参数及作用 三、自动管理IP地址1、机房所用的网络地址以及参数信息2、关闭虚拟网…

Agisoft Metashape 红外影像处理

系列文章目录 文章目录 系列文章目录前言一、加载红外影像二、对齐照片三、构建 DEM四、生成 DOM五、温度值可视化前言 Agisoft Metashape 专业版支持处理来自 AscTec(ARA 格式)、WIRIS(TIFF 格式)热成像仪和以 R-JPEG(FLIR 数据)格式保存数据的热成像数据。 在本文中,…

如何编写自动化测试用例,一篇带你解决

自动化测试脚本 什么是自动化测试&#xff1f; 自动化测试是验证和验证软件是否满足所有用户需求&#xff0c;并使用自动化工具按预期运行。它检查在产品开发阶段期间和之后出现的错误、问题和其他类型的缺陷。这种类型的软件测试运行在由测试工具处理的编程脚本上。有多种测…

linux基础(IO)

目录&#xff1a; 1.复习C文件IO相关操作 2.介绍C程序会默认打开3个输入输出流 3.学习文件的系统调用接口 ---------------------------------------------------------------------------------------------------------------------------- 1.复习C文件IO相关操作 fopen函数…

HTTP协议格式及 fiddler 的使用

HTTP 协议格式 简述 HTTP 协议fiddler(抓包工具) 的使用协议格式总结 : 简述 HTTP 协议 HTTP 协议是个使用非常广泛的应用层协议, 应用层协议通常是需要 “自定义协议” 的, 自定义协议可以基于现有协议进行定制, HTTP 之所以应用广泛就是因为其可定制性非常强. 日常生活中遇到…

网络安全工程师的岗位需求,破237万了!

3月底凌晨&#xff0c;腾讯QQ和微信的相关业务都出现了功能异常。 包括微信语音对话、朋友圈、微信支付&#xff0c;以及QQ文件传输、QQ空间和QQ邮箱在内的多个功能无法使用。 这事儿都听说了吧&#xff1f; 据报道&#xff0c;这次的事故是因为电信机房冷却系统故障导致。 …

Linux安装Tomcat搭建Jenkins

前提条件 由于Tomcat服务器主要用于部署java web项目。所以先安装java jdk。安装过程大家应该很轻车熟练了。 一、安装Tomcat 创建/usr/tomcat文件夹 mkdir -p /usr/tomcat下载tomcat安装包 wget https://archove.apache.org/dist/tomcat/tomcat-8/v8.0.23/bin/apache-tomcat…

umi4 实现msal aad 登录loginRedirect方式并获取令牌

在 Umi 4 中使用 Ant Design Pro Layout 以及 MSAL (Microsoft Authentication Library) 实现登录并获取令牌进入到首页&#xff0c;你需要按照以下步骤进行操作&#xff1a; 安装所需依赖&#xff1a; 使用 npm 或 yarn 安装所需的包&#xff1a; npm install azure/msal-bro…

从零开始Vue3+Element Plus后台管理系统(十)——自定义水印指令与全局注册

在实际项目开发中&#xff0c;自定义指令用得还是比较多的&#xff0c;比如&#xff1a;复制粘贴、输入框防抖、输入框禁止特殊字符、权限校验、背景水印、拖拽等等… 指令确实是个优雅的存在。 Vue3中定义一个普通的自定义指令的详细说明参见官网&#xff1a;https://cn.vue…

sentinel配置持久化到apollo

背景 sentinel-dashborad的配置默认是存储到内存中的&#xff0c;生产环境肯定不能这样使用&#xff0c;官网支持zookeeper、nacos、apollo的配置&#xff0c;本文就来介绍apollo的持久化 apollo sentinel-dashboard 整合 apollo 进行规则的持久化配置&#xff0c;主要方式是…

Kettle获取接口数据到表

kettle从接口服务获取数据 主要用到kettle输入菜单下的控件&#xff1a;生成记录、JSON input 查询菜单下的控件&#xff1a;HTTP client 输出菜单下的控件&#xff1a;表输出、插入/更新 生成记录&#xff1a;设置一个变量&#xff0c;用这个变量来保存要去访问接口的URL地址…

数据结构学习之队列

前言&#xff1a;在我们学习了栈之后&#xff0c;明白了它的结构的特殊性即LAST IN FIRST OUT(后进先出)&#xff0c;与之相对应的也有一个特殊的结构队列&#xff08;queue&#xff09;--FIRST IN FIRST OUT(先进先出)&#xff0c;他们都是面对特殊情况下的数据的结构&#xf…

支持导入 Postman ,用这个插件就可以了

首先安装 导入 Postcat 插件&#xff0c;之后就可以愉快的导入 Postman 格式的文件了。 右上角——选择导入——选择Postman 格式——拖入文件 导入即可&#xff01;再也不用担心 Postcat 格式的 api 文件能把自己难住了&#xff01; 如果你日常会用到 api 管理工具的话&#x…

5G和物联网将如何重塑汽车行业?物联网将给汽车行业带来哪些变革?

“ 物联网(Internet of Things)的诞生给无数行业带来了变革&#xff0c;其中就包括汽车行业。物联网对于汽车发展的重要性是毋庸置疑的。从网联汽车到智能交通系统&#xff0c;物联网正在为汽车行业开辟下一个汽车时代。汽联网(Internet of Vehicles)正在成型。” 我们今天看到…

k8s部署mysql并使用nfs持久化数据

k8s部署mysql并使用nfs持久化数据 一、配置nfs服务器1.1 修改配置文件1.2. 载入配置1.3. 检查服务配置 二、创建K8S资源文件2.1 mysql-deployment.yml2.2 mysql-svc.yml 一、配置nfs服务器 参考文章: pod使用示例https://cloud.tencent.com/developer/article/1914388nfs配置…

管好【SD-WEBUI】中大量的模型:名称+预览图+备注+分组(Part.2)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;模型预览图&#xff08;1.1&#xff09;预览图姿态&#xff08;证件照&#xff09;&#xff08;1.2&#xff09;预览图姿态&#xff08;半身动作&#xff09; &#xff08;二&#xff09;LoRA模型名称&#…

机器人关节电机PWM

脉冲宽度调制(Pulse width modulation,PWM)技术。一种模拟控制方式 机器人关节电机的控制通常使用PWM(脉冲宽度调制)技术。PWM是一种用于控制电子设备的技术,通过控制高电平和低电平之间的时间比例,实现对电子设备的控制。在机器人关节电机中,PWM信号可以控制电机的…

C++ | 高效使用vector

C | 高效使用vector 文章目录 C | 高效使用vector1.善用Reserve2.移动构造和赋值3.释放vector如果vector内存的是指针&#xff0c;需要先释放每个指针所指内存&#xff0c;再释放vectorReference 1.善用Reserve 当需要向vector中添加元素但目前的空间已经放满时&#xff0c;ve…

200G AOC有源光缆在数据中心的应用

随着大数据时代对高速、高带宽的需求日益增长&#xff0c;人们迫切需要一种新型产品作为高性能计算和数据中心的主要传输介质。因此&#xff0c;光通信传输速率的发展也提高了。面对短距离数据中心在光互连产品中的高速、高密度、低成本、低功耗要求&#xff0c;AOC有源光缆提供…

shell脚本----awk命令

文章目录 一、awk工作原理二、awk相关命令三、awk的使用按行输出文本:按字段输出文本&#xff1a;通过管道、双引号调用 Shell 命令&#xff1a; 一、awk工作原理 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中…