【华为机试】2023年真题B卷(python)-猴子爬山

一、题目

题目描述:

一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台阶的阶梯,但是这猴子有一个习惯:
每一次只能跳1步或跳3步,试问猴子通过这个阶梯有多少种不同的跳跃方式?

二、输入输出

输入描述:
输入只有一个整数N(0输出描述:
输出有多少种跳跃方式(解决方案数)。

三、示例

示例1:

输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
50
输出:
122106097
示例2:

输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
3
输出:
2

【华为机试】2023年真题B卷(python)-猴子爬山_第1张图片

四、解题思路

这是一个经典的动态规划问题。我们可以使用动态规划的思想来解决这个问题。

首先,我们定义一个长度为N+1的数组dp,其中dp[i]表示通过i个台阶的跳跃方式的解决方案数。

然后,我们可以根据题目描述的规则,推导出状态转移方程:
dp[i] = dp[i-1] + dp[i-3]

解释一下这个状态转移方程的含义:

  • 当前位置i的解决方案数等于前一步位置i-1的解决方案数加上前一步位置i-3的解决方案数。
  • 这是因为,要到达当前位置i,可以从前一步位置i-1跳一步到达,也可以从前一步位置i-3跳三步到达。

接下来,我们可以使用动态规划的方法来计算解决方案数。我们从起始位置开始,逐步计算每个位置的解决方案数,直到达到目标位置N。

最后,返回目标位置N的解决方案数作为结果。

五、参考代码 

# -*- coding: utf-8 -*-
'''
@File    :   2023-B-猴子爬山.py
@Time    :   2023/12/29 19:30:20
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

# import os
# import re
# import sys
# import copy
# import math
# import queue
# import functools
# from queue import Queue
# from collections import Counter, defaultdict

def count_jump_ways(N):
    if N <= 0:
        return 0

    # 定义动态规划数组
    dp = [0] * (N + 1)

    # 初始条件
    dp[0] = 1

    # 计算解决方案数
    for i in range(1, N + 1):
        dp[i] = dp[i - 1] + (dp[i - 3] if i >= 3 else 0)

    return dp[N]

N = int(input())
result = count_jump_ways(N)
print(result)

你可能感兴趣的:(华为机试,华为,python,算法,华为机试,猴子爬山)