问题一:青蛙跳台阶
从前有一只青蛙想跳台阶去等峰,若该青蛙一次可以跳上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))
-
输入数据的获取:
用户在运行程序时通过键盘输入数据。第一行包含两个正整数 n 和 m,表示青蛙要跳到的目标台阶数 n 和必须经过的台阶数 m,其中 m <= n。 -
输入数据读入:
使用 input() 函数读取输入的字符串。 -
算法处理:
-
算法思想
为了求解该问题,我们采用动态规划的思想。动态规划适用于解决具有重叠子问题和最优子结构性质的问题,通过将问题分解成子问题来求解,避免了重复计算。 -
动态规划状态定义
定义一个数组 dp,其中 dp[i] 表示从第0级台阶跳到第 i 级台阶的跳法总数。初始状态为 dp[0] = 1,即从第0级台阶到第0级台阶只有一种跳法,不跳。 -
状态转移方程
对于每一级台阶 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。
-
算法实现
为了确保青蛙在第 m 级台阶停留过,我们可以使用一个数组 visited 来记录青蛙是否访问过某一级台阶。在计算跳法时,检查是否在 m 级台阶停留过,并根据这个条件调整最终结果。 -
算法复杂度
时间复杂度:该算法的时间复杂度为 (O(n)),因为我们只需遍历一次台阶数进行动态规划计算。
空间复杂度:该算法的空间复杂度为 (O(n)),需要额外的空间来存储 dp 和 visited 数组。 -
算法输出:
根据动态规划算法计算出从第0级台阶跳到第 n 级台阶且在第 m 级台阶停留过的跳法总数。 -
输出展示: