兔子繁殖问题是一个经典的递归问题,通常用于引导学习动态规划和递归。在这个问题中,假设有一对兔子,每个月这对兔子会生出一对新兔子,新兔子在第二个月开始也会生出新兔子。问题是:经过 $ n $ 个月后,会有多少对兔子?
状态转移方程
如果我们定义 $ F(n) $ 为第 $ n $ 个月的兔子对数,那么状态转移方程为:
其中:
- $ F(1) = 1 $
- $ F(2) = 1 $
这是因为第 $ n $ 个月的兔子对数等于前一个月的兔子对数加上再前一个月的兔子对数。
动态规划实现 (PHP)
我们可以使用动态规划来高效地解决这个问题。下面是用 PHP 实现的代码:
1 |
|
解释
- 初始条件:当 $ n $ 为 1 或 2 时,兔子对数为 1。
- 动态规划数组:
$dp
用于存储每个月的兔子对数,初始化为长度为 $ n+1 $ 的数组,所有元素初始为 0。 - 状态转移:通过循环,从第 3 个月开始计算,每个月的兔子对数等于前一个月的兔子对数加上再前一个月的兔子对数。
- 返回结果:最终返回第 $ n $ 个月的兔子对数。
通过这种方法,可以在 $ O(n) $ 的时间复杂度内计算出任意 $ n $ 个月后的兔子对数。