首页 > 其他分享 >【递推】兔子繁殖问题

【递推】兔子繁殖问题

时间:2024-06-01 17:58:23浏览次数:17  
标签:成年 样例 上一年 long 兔子 繁殖 小兔 递推

题目描述

如果有一对小兔,每一个月都生下一对小兔,而所生下的每一对小兔在出生后的第三个月也都生下一对小兔。那么,由一对兔子开始,n 个月后有多少对小兔子呢?


输入

输入一个数字 n(1≤n≤100),代表题目中询问的月份。

输出

对于每个询问,输出一行整数,代表 n 月的时候,小兔子的数量。


样例输入1
4
样例输出1
5
样例输入2
65
样例输出2
27777890035288

数据规模与约定

时间限制:1 s

内存限制:64 M

40% 的数据保证 n≤20

100% 的数据保证 n≤100


解题

我们不妨设定兔子的第一年为幼体兔子,第二年为成年兔子,然后第三年成年兔子能够进行繁殖。

可以大概列出该情况:

成年幼年
第一年10
第二年11
第三年21
第四年32

我们不难认为,每年成年的兔子数为【上一年成年兔子】+【上一年幼年兔子】之和,即【上一年兔子总数】。我们用f(n)表示第n年兔子数量,则第n年成年兔子数可表示为f(n-1)。

而每年的幼年兔子数显然等于上一年成年兔子数,也等于上上一年兔子总数,可表示为f(n-2)。

以上不难理解。

我们可以用函数表达:

于是我们可以完成代码:

#include <iostream>
using namespace std;
int f(int n) {
	if (n <= 2)return n;
	return f(n - 1) + f(n - 2);
}
int main()
{
	int n;
	cin >> n;
	cout << f(n);
	return 0;
}

代码优化

在执行代码过程中,我们发现当n稍大时,程序便会发生超时。实际上,这是因为递归调用时产生大量非必要重复运算。

如图,红色部分是重复运算。实际上,我们只需要使用蓝色部分的结果即可。我们可以用记忆化的技巧来优化代码。即定义一个数组来存储运算结果。

本题运算结果较大,我们可用long long 类型来表示。

#include <iostream>
#define MAX_N 100

using namespace std;
long long arr[MAX_N+5] = { 0 };
long long f(long long n) {
	if (n <= 2)return n;
	if (arr[n])return arr[n];
	arr[n]= f(n - 1) + f(n - 2);
	return arr[n];
}
int main()
{
	long long n;
	cin >> n;
	cout << f(n);
	return 0;
}

标签:成年,样例,上一年,long,兔子,繁殖,小兔,递推
From: https://blog.csdn.net/weixin_74873063/article/details/139376225

相关文章

  • 小明爬楼梯(4)(递推)
    题目描述小明很喜欢爬楼梯,这一次,他获得了一个特异功能,每次可以跳跃1、4、7、10、...级阶梯。比如他初始在楼底,跨越一个阶梯到达 1 号阶梯,或者跨越 4 个楼梯到达 4 号阶梯。为了选出一种最轻松的爬楼梯的方式,小明想把所有不同的到达楼顶的方式都尝试一遍。对于一共有 ......
  • 小明爬楼梯(1)(递推)
    题目描述小明很喜欢爬楼梯,但是小明腿不够长,每次小明最多只能一步跨越两个阶梯。比如他初始在楼底,跨越一个阶梯到达 1号阶梯,或者跨越两个阶梯到达 2 号阶梯。为了选出一种最轻松的爬楼梯的方式,小明想把所有不同的到达楼顶的方式都尝试一遍。对于一共有 n 个阶梯的楼梯,小......
  • 「杂题乱刷」洛谷 P10468 兔子与兔子
    题目链接P10468兔子与兔子解题思路字符串哈希板子题。思路就是我们给字符串的每一个前缀和后缀都用一种特定的方式使其变为一个值,比如取一个乘数和模数,可以证明这样出错的概率极低。参考代码这里使用自然溢出三哈希。#include<bits/stdc++.h>usingnamespacestd;#defin......
  • 学习笔记:生成函数II(集合分拆、置换、整数分拆、它们的递推公式、生成函数 和快速计算)
    形式幂级数的更多运算形式幂级数与幂级数的比较形式幂级数本质是序列(\(x^i\)无意义),幂级数本质是极限。形式幂级数通过带入\(x\)还原成幂级数。假设系数在\(\mathbb{C}\)上,可以证明形式幂级数与具有正收敛半径的幂级数在'通常'的所有运算上服从同样规律(加减乘除求导积......
  • FFT 优化常系数齐次线性递推式
    \(f_i\)序列满足\(f_i=\displaystyle\sum_{j=1}^kc_jf_{i-j}\)。\(k\le32000,n\le10^9\)。已知\(f_1\simf_k\)和\(c_1\simc_k\)。求\(f_n\)。这称为"\(k\)次齐次常系数线性递推式"。如果\(k\)比较小,可以用矩阵快速幂;但\(k\)太大,一次矩阵乘法都很慢。我们可......
  • 第?课——基于矩阵快速幂的递推解法
    第?课——基于矩阵快速幂的递推解法由于中间的数论部分我自己学的很差,没有办法写出清晰的博客来,所以这里跳过了数论部分的博客,来到矩阵快速幂。递推递推是一个非常常用的工具。比如经典的斐波那契数列:\[f(x)=\left\{\begin{array}{**lr**}1&,0\l......
  • 洛谷题解-官方题单-递归与递推
    P1255数楼梯原题链接题目描述楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。对于60%的数据,N≤50;对于100%的数据,1≤N≤5000。思路:每次有2种方法上楼梯,要么上一阶,要么上二阶。第一种:得50分的做法是可以用递归来解:点击查看代码......
  • C117 莫队配合 bitset P4688 [Ynoi2016] 掉进兔子洞
    视频链接:C117莫队配合bitsetP4688[Ynoi2016]掉进兔子洞_哔哩哔哩_bilibili   LuoguP4688[Ynoi2016]掉进兔子洞//莫队配合bitsetO(n*sqrt(n))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<bitset>usin......
  • 【递推与递归】python例题详解
    文章目录1、递归实现指数型枚举2、递归实现排列型枚举3、递归实现组合型枚举4、简单斐波那契5、带分数6、翻硬币1、递归实现指数型枚举题目从 1∼n这 n个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数 n。输出格式每行输出一种方案。同一......
  • 试题 算法训练 数字三角形(本人粗暴解法+递推与记忆化搜索解法)
    问题描述(图3.1-1)示出了一个数字三角形。请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。●每一步可沿左斜线向下或右斜线向下走;●1<三角形行数≤100;●三角形中的数字为整数0,1,…99;输入格式文件中首先读到的是三角形的行......