青蛙跳台阶

问题一:青蛙跳台阶
从前有一只青蛙想跳台阶去等峰,若该青蛙一次可以跳上1级台阶、也可以跳上2级、还可以跳3级。那么改青蛙从第0级台阶出发,在跳上第n级台阶且在第m级台阶停留过时有多少种跳法。
输入描述:
第一行两个正整数,n和m m<=n
输出描述:
一个整数,表示跳法
输入样例:
4 2
输出样例:
4

def frog_jump(n, m):
if m > n:
return 0

dp = [0] * (n + 1)
visited = [0] * (n + 1)
dp[0] = 1 

for i in range(1, n + 1):
    if i >= 1:
        dp[i] += dp[i - 1]
        visited[i] += visited[i - 1]
    if i >= 2:
        dp[i] += dp[i - 2]
        visited[i] += visited[i - 2]
    if i >= 3:
        dp[i] += dp[i - 3]
        visited[i] += visited[i - 3]
    if i == m:
        visited[i] = dp[i]

return visited[n]

n, m = map(int, input().split())

print(frog_jump(n, m))

  1. 输入数据的获取:
    用户在运行程序时通过键盘输入数据。第一行包含两个正整数 n 和 m,表示青蛙要跳到的目标台阶数 n 和必须经过的台阶数 m,其中 m <= n。

  2. 输入数据读入:
    使用 input() 函数读取输入的字符串。

  3. 算法处理:

  4. 算法思想
    为了求解该问题,我们采用动态规划的思想。动态规划适用于解决具有重叠子问题和最优子结构性质的问题,通过将问题分解成子问题来求解,避免了重复计算。

  5. 动态规划状态定义
    定义一个数组 dp,其中 dp[i] 表示从第0级台阶跳到第 i 级台阶的跳法总数。初始状态为 dp[0] = 1,即从第0级台阶到第0级台阶只有一种跳法,不跳。

  6. 状态转移方程
    对于每一级台阶 i,青蛙可以通过以下三种方式到达:
    从第 i1 级台阶跳1级到达第 i 级;
    从第 i2 级台阶跳2级到达第 i 级;
    从第 i3 级台阶跳3级到达第 i 级。

因此,状态转移方程为:
[ dp[i] = dp[i1] + dp[i2] + dp[i3] ]
其中,当 i 小于1、2、3时,相应的 dp[i1]、dp[i2] 和 dp[i3] 应该被视为0。

  1. 算法实现
    为了确保青蛙在第 m 级台阶停留过,我们可以使用一个数组 visited 来记录青蛙是否访问过某一级台阶。在计算跳法时,检查是否在 m 级台阶停留过,并根据这个条件调整最终结果。

  2. 算法复杂度
    时间复杂度:该算法的时间复杂度为 (O(n)),因为我们只需遍历一次台阶数进行动态规划计算。
    空间复杂度:该算法的空间复杂度为 (O(n)),需要额外的空间来存储 dp 和 visited 数组。

  3. 算法输出:
    根据动态规划算法计算出从第0级台阶跳到第 n 级台阶且在第 m 级台阶停留过的跳法总数。

  4. 输出展示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值