青训营X豆包MarsCode 技术训练营刷题技巧(动态规划专题篇六) | 豆包MarsCode AI 刷题

58 阅读2分钟

兔群繁殖之谜

题目描述

image.png

题目分析

这道题是典型的斐波那契数列问题,描述了一种理想化的兔子繁殖模式

动态规划状态分析

  1. 状态定义

    • 定义 F[i]F[i]F[i] 表示第 iii 个月的兔子总对数。
  2. 转移方程

    F[i]=F[i−1]+F[i−2]F[i] = F[i-1] + F[i-2]F[i]=F[i−1]+F[i−2]

  3. 初始化

    • F[1]=1F[1] = 1F[1]=1
    • F[2]=1F[2] = 1F[2]=1
  4. 目标

    • 计算 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)

有限制的楼梯攀登

题目描述

image.png

题目分析

这道问题描述的本质是一个约束的动态规划问题,但是多了带约束的路径计数,类似上一篇的旅行补给站问题。

动态规划状态分析

  • 状态定义

    • 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)