问题描述
生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律:
每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。 兔子永远不会死亡。 小 R 从一对新生的小兔子开始观察。他想知道在第 A 个月末,总共会有多少对兔子。
请你帮助小 R 编写一个程序,计算在给定的月份 A 时,兔子群体的总对数。
注意:
初始时有 1 对新生小兔子。 第 1 个月末有 1 对兔子:原来那对变成了成年兔子,并开始繁殖。 第 2 个月末有 2 对兔子:原来那 1 对成年兔子,繁殖了 1 对新生的小兔子。 从第 3 个月开始,兔子群体会按照上述规律增长。
输入
一个整数 A(1 ≤ A ≤ 50),表示月份数
输出
一个长整数,表示第 A 个月末兔子的总对数。
测试用例
样例1:
输入:A = 1 返回:1
样例2:
输入:A = 5 返回:8
样例3:
输入:A = 15 返回:987
解题思路
理解问题:每个月的兔子对数是前两个月的兔子对数之和。 数据结构:我们可以使用一个列表来存储每个月的兔子对数。 算法步骤: 初始化前两个月的兔子对数。 从第三个月开始,每个月的兔子对数是前两个月的兔子对数之和。 返回第 A 个月的兔子对数。
代码提示(以PYthon形式)
def solution(A: int) -> int:
# 初始化前两个月的兔子对数
if A == 1:
return 1
elif A == 2:
return 2
# 初始化前两个月的兔子对数
first, second = 1, 2
# 从第三个月开始计算
for _ in range(3, A + 1):
# 计算当前月的兔子对数
current = first + second
# 更新前两个月的兔子对数
first, second = second, current
return second
if __name__ == "__main__":
# 测试用例
print(solution(1) == 1)
print(solution(5) == 8)
print(solution(15) == 987)
关键步骤解释
初始化前两个月的兔子对数: 如果 A 是 1,直接返回 1。 如果 A 是 2,直接返回 2。 从第三个月开始计算: 使用一个循环从第三个月开始,计算每个月的兔子对数。 当前月的兔子对数是前两个月的兔子对数之和。 更新前两个月的兔子对数,以便下一次循环使用。
可能遇到的问题: 如何使用动态规划来解决这个问题?
使用动态规划来解决这个问题是一个很好的选择,因为它可以有效地避免递归带来的重复计算问题。我们可以通过维护一个数组来存储每个月的兔子对数,从而逐步计算出第 A 个月的兔子对数。
解题思路
def solution(A: int) -> int:
# 初始化数组,存储每个月的兔子对数
dp = [0] * (A + 1)
# 初始化前两个月的兔子对数
dp[1] = 1
dp[2] = 2
# 从第三个月开始计算
for i in range(3, A + 1):
# 当前月的兔子对数是前两个月的兔子对数之和
dp[i] = dp[i - 1] + dp[i - 2]
# 返回第 A 个月的兔子对数
return dp[A]
if __name__ == "__main__":
# 测试用例
print(solution(1) == 1)
print(solution(5) == 8)
print(solution(15) == 987)
关键步骤解释
初始化数组: 创建一个长度为 A + 1 的数组 dp,用于存储每个月的兔子对数。 初始化 dp[1] 为 1,表示第 1 个月的兔子对数。 初始化 dp[2] 为 2,表示第 2 个月的兔子对数。 从第三个月开始计算:
使用一个循环从第 3 个月开始,计算每个月的兔子对数。 当前月的兔子对数是前两个月的兔子对数之和,即 dp[i] = dp[i - 1] + dp[i - 2]。
返回第 A 个月的兔子对数: 返回 dp[A],即第 A 个月的兔子对数。
总结
此题使用动态规划解决问题更合适,题目难度适中。