top1编程
← 返回题目
题解

台阶问题

1 条题解

  • 0
    @ 2026-8-5 23:21:11

    P4730 台阶问题(入门)

    解题思路

    小鹿上楼梯,一次可以迈 1 级,也可以迈 2 级。我们要算出上到第 n 级台阶一共有多少种走法。

    先用小例子找规律。上第 1 级,只有 1 种走法(直接迈 1 级),记 f[1]=1。上第 2 级,可以一次迈 2 级,也可以分两次各迈 1 级,共 2 种走法,记 f[2]=2。上第 3 级呢?可以这样想:最后一步如果迈 1 级,那么前面已经上了 2 级,有 f[2]=2 种走法;最后一步如果迈 2 级,那么前面已经上了 1 级,有 f[1]=1 种走法。合起来 f[3]=2+1=3。

    一般地,最后一步只有两种情况:迈 1 级或迈 2 级。所以上到第 n 级的走法数满足 f[n] = f[n-1] + f[n-2],这就是著名的斐波那契数列。我们把 f[1]、f[2] 当作起点,从第 3 项开始一项一项往前推。n 最大只有 19,f[19]=6765,用 long long 保存绰绰有余。边界情况:n=1 时直接输出 1,n=2 时直接输出 2。

    参考代码

    // 台阶问题:上n级台阶,一步走1级或2级,统计总走法数(斐波那契递推)
    #include <iostream>
    int main(){
      long long a=1,b=2,c;  // a=f(1), b=f(2)
      int n,i;
      std::cin>>n;
      if(n==1){ std::cout<<1; return 0; }
      for(i=3;i<=n;i++){ c=a+b; a=b; b=c; }  // f[i]=f[i-1]+f[i-2]
      std::cout<<b;
      return 0;
    }
    

    复杂度分析

    只用了一个循环从第 3 项推到第 n 项,每推一步做一次加法,所以时间是 O(n)。空间上只用了几个 long long 变量,是 O(1)。n 最多 19,循环 19 次就结束,运行速度非常快。

    • 1