1. 问题理解与初步分析
这个台阶问题实际上是一个经典的动态规划入门题目。想象你站在一栋高楼的底部,面前有一段n级的台阶。每次你可以选择迈上1级、2级或3级台阶。我们需要计算出从底部到达顶部所有可能的走法总数。
这个问题看似简单,但蕴含着递归和动态规划的核心思想。让我们先从小规模案例入手:
- 当n=1时:只有[1]这一种走法 → 总数1
- 当n=2时:有[1,1]和[2]两种走法 → 总数2
- 当n=3时:有[1,1,1]、[1,2]、[2,1]和[3]四种走法 → 总数4
- 当n=4时:如题目所示有7种走法
通过观察这些基础案例,我们可以发现一个规律:到达第n级台阶的走法数,等于前三级台阶走法数的总和。这是因为最后一步只能是1级、2级或3级跨上来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 递归解法与问题剖析
2.1 递归思路实现
最直观的解法是使用递归。我们可以将问题分解为子问题:
c复制int countWays(int n) {
if (n == 0) return 1; // 地面算作一种"走法"
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
return countWays(n-1) + countWays(n-2) + countWays(n-3);
}
注意:这里n=0返回1是递归的基准情况,表示已经到达目标的一种有效走法。
2.2 递归解法的问题
虽然递归解法简单直观,但它存在严重的效率问题。让我们分析其时间复杂度:
- 每次调用会产生3个新的递归调用
- 递归深度为n
- 时间复杂度为O(3^n) —— 指数级增长
例如计算countWays(20):
- 需要约3^20 ≈ 3.5亿次递归调用
- 存在大量重复计算(如countWays(15)会被计算无数次)
这种暴力递归在实际应用中是完全不可行的,我们需要更高效的解决方案。
3. 动态规划解决方案
3.1 动态规划思路
动态规划(Dynamic Programming)通过存储子问题的解来避免重复计算。对于这个台阶问题:
- 定义状态:dp[i]表示到达第i级台阶的走法数
- 状态转
