求解爬台阶问题
题目分析
爬台阶问题是一个经典的动态规划问题,题目给定一个高度为 n n n 的台阶,每次可以选择向上走 1、2 或 3 个台阶,问从底部到顶部共有多少种走法。
问题描述:
- 给定台阶数 n n n,每次可以选择走 1、2 或 3 步。
- 目标是计算从底部到顶部的不同走法数量。
示例:
- 输入:
n = 4
- 输出:7(不同走法:1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2, 1+3, 3+1)
思路分析
-
定义状态:
- 使用数组 d p dp dp,其中 d p [ i ] dp[i] dp[i] 表示到达第 i i i 个台阶的不同走法数量。
-
初始化:
- d p [ 0 ] = 1 dp[0] = 1 dp[0]=1,表示站在地面上(第 0 个台阶)只有一种方式:不动。
- d p [ 1 ] = 1 dp[1] = 1 dp[1]=1,表示到达第 1 个台阶只有一种方式:一步到达。
- d p [ 2 ] = 2 dp[2] = 2 dp[2]=2,表示到达第 2 个台阶有两种方式:1+1 或 2。
- d p [ 3 ] = 4 dp[3] = 4 dp[3]=4,表示到达第 3 个台阶有四种方式:1+1+1, 1+2, 2+1, 3。
-
状态转移方程:
- 对于每个台阶 i i i,到达该台阶的方式可以通过以下三种方式:
- 从 i − 1 i-1 i−1 走一步到达;
- 从 i − 2 i-2 i−2 走两步到达;
- 从 i − 3 i-3 i−3 走三步到达。
所以状态转移方程为:
d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] + d p [ i − 3 ] dp[i] = dp[i-1] + dp[i-2] + dp[i-3] dp[i]=dp[i−1]+dp[i−2]+dp[i−3] - 对于每个台阶 i i i,到达该台阶的方式可以通过以下三种方式:
-
结果:
- 最终, d p [ n ] dp[n] dp[n] 即为所求的走法数量。
案例解释
以 n = 4 n = 4 n=4 为例,具体步骤如下:
- 初始化: d p = [ 1 , 1 , 2 , 4 , 0 ] dp = [1, 1, 2, 4, 0] dp=[1,1,2,4,0]
- 计算 d p [ 4 ] dp[4] dp[4]:
- d p [ 4 ] = d p [ 3 ] + d p [ 2 ] + d p [ 1 ] = 4 + 2 + 1 = 7 dp[4] = dp[3] + dp[2] + dp[1] = 4 + 2 + 1 = 7 dp[4]=dp[3]+dp[2]+dp[1]=4+2+1=7
所以,到达第 4 个台阶的不同走法有 7 种,分别是:
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
代码实现
python代码
import os
import sys# 请在此输入您的代码
# 小心越界访问的段错误
def init_arr(size):arr = [0] * sizearr[0] = arr[1] = 1if size > 2:arr[2] = 2if size > 3:arr[3] = 4return arrdef solve(dp):# 对于每层阶梯,可以从i-1走一步到达,从i-2走两步到达以及从i-3走三步到达for i in range(4,len(dp)):dp[i] = dp[i-1] + dp[i-2] + dp[i-3]n = int(input())
dp = init_arr(n+1)
if n > 3:solve(dp)
print(dp[n])
C++代码
#include<bits/stdc++.h>
using namespace std;void solve(int*, int);int main() {int n;cin >> n;int* dp = new int(n + 1);dp[0] = dp[1] = 1;if (n > 2) {dp[2] = 2;}if (n > 3) {dp[3] = 4;}if (n > 3) {solve(dp,n);}cout<<dp[n];return 0;
}void solve(int* dp, int n) {for (int i = 4; i <= n; i++) {*(dp + i) = *(dp + i - 1) + *(dp + i - 2) + *(dp + i - 3);}
}
总结
爬台阶问题是一个典型的动态规划问题,通过定义状态和状态转移方程,可以有效地计算出从底部到顶部的不同走法数量。我们通过将每个台阶的走法数量存储在数组中,并根据前面的台阶计算当前台阶的走法数量,最终求解出所需的答案。