兔群繁殖之谜
题目描述
题目分析
这道题是典型的斐波那契数列问题,描述了一种理想化的兔子繁殖模式
动态规划状态分析
-
状态定义:
- 定义 F[i]F[i]F[i] 表示第 iii 个月的兔子总对数。
-
转移方程:
F[i]=F[i−1]+F[i−2]F[i] = F[i-1] + F[i-2]F[i]=F[i−1]+F[i−2]
-
初始化:
- F[1]=1F[1] = 1F[1]=1
- F[2]=1F[2] = 1F[2]=1
-
目标:
- 计算 F[A]F[A]F[A],并返回结果。
Python代码
def solution(A):
# 创建斐波那契数列的数组
f = [0] * (A + 1)
# 初始化 f[0] 和 f[1]
f[0], f[1] = 1, 1
# 计算斐波那契数列
for i in range(2, A + 1):
f[i] = f[i - 1] + f[i - 2]
return f[A]
if __name__ == "__main__":
# Add your test cases here
print(solution(5) == 8)
print(solution(1) == 1)
print(solution(15) == 987)
print(solution(50) == 20365011074)
有限制的楼梯攀登
题目描述
题目分析
这道问题描述的本质是一个约束的动态规划问题,但是多了带约束的路径计数,类似上一篇的旅行补给站问题。
动态规划状态分析
-
状态定义:
- dp[i] 表示到达第 i 层的方法总数。
-
转移方程:
- 如果当前层是通过走1步到达,则可以从 dp[i−1]转移过来。
- 如果当前层是通过走2步到达,则只能从 dp[i−3]转移过来(确保不会连续跳两次2层)。
因此转移方程为:
dp[i]=dp[i−1]+dp[i−3] -
边界条件:
- dp[1]=1:第1层只能通过一步到达。
- dp[2]=2:第2层可以通过两次1步或一次2步到达。
- dp[3]=3:第3层可以通过三次1步、一次1步+一次2步,或者一次2步+一次1步到达。
-
目标:
- 求解 dp[n],即到达第 n 层的方法总数。
Python代码
def solution(n):
# 初始化 dp 数组,用于存储到达每一级的不同方法数
dp = [0] * (n + 1)
# 边界条件
if n == 1:
return 1
elif n == 2:
return 2
elif n == 3:
return 3
else:
# 初始化前三项
dp[0] = 0
dp[1] = 1
dp[2] = 2
dp[3] = 3
# 从第 4 项开始,使用递推公式计算 dp[i]
for i in range(4, n + 1):
dp[i] = dp[i - 1] + dp[i - 3]
return dp[n]
if __name__ == "__main__":
# Add your test cases here
print(solution(2) == 2)