美文网首页E_C/C++程序员
“小明爬楼梯”问题

“小明爬楼梯”问题

作者: yigoh | 来源:发表于2015-01-17 15:12 被阅读1105次

问题来源

可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有36个台阶,小明一共有多少种爬法呢?

这是典型的递归问题:小明爬到第36个台阶,可以从第35个台阶再爬1阶上去;可以从第34个台阶再爬2阶上去,也可以从第33个台阶再爬3阶上去——所以,他爬36阶可选择的爬法的数目相当于,爬35、34、33阶可选择的爬法的总数目,而爬35、34、33阶各自可选择的爬法的数目,又可以像这样计算,直到回到最简单的爬3、2、1阶可选择的爬法的数目(依次是4种、2种和1种)。

于是我们得到答案:小明这样爬36个台阶,一共有2082876103种爬法。

下面是解决该问题的一份C程序代码:

#include<stdio.h>
int f(int n){
    switch(n){
        case 1:
            return 1;
        case 2:
            return 2;
        case 3:
            return 4;
        default:
            return f(n-1)+f(n-2)+f(n-3);
    }
}
int main(){
    printf("%d\n",f(36));
    return 0;
}

它虽然很直观,但速度却比较慢。

于是再提供一份相对复杂,但更快的C程序代码:

#include<stdio.h>
long f(int n){
    n++;
    int i;
    long table[n];
    for(i=0;i<n;i++){
        table[i]=0;
    }
    table[1]=1;
    table[2]=2;
    table[3]=4;
    for(i=4;i<n;i++){
        table[i]=table[i-1]+table[i-2]+table[i-3];
    }
    return table[n-1];
}
int main(){
    printf("%d\n",f(36));
    return 0;
}

相关文章

  • “小明爬楼梯”问题

    问题来源 可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果...

  • 记一次今日头条视频技术面试

    1.题目:继承 解答: 2.题目: 解答: 3.假设某个楼梯有n级,小明要爬上楼梯,小明爬楼梯的时候可能一次走1步...

  • 爬楼梯问题

    接触DP最早的应该就是这道题了吧,翻了翻leetcode submission发现最早的是在一年前... 而且是最...

  • 爬楼梯问题

    今天看到一个斐波纳切问题的变形,觉得很有意思,遂记录一下: 一个青蛙爬楼梯,他可以一次跳一节台阶,也可以跳两节,还...

  • 2020-05-07

    题目描述: 小明在凌空SOHO上班,想通过爬楼梯的方式锻炼,他爬楼梯的方式有3种,一步跨一层、一步跨两层或一步跨3...

  • LeetCode中动态规划问题的做题记录

    常规动态规划问题 相关题目: 70.爬楼梯 70.爬楼梯 描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每...

  • 小明回家问题

    Redraiment的老家住在工业区,日耗电量非常大。是政府的眼中钉 肉中刺,但又没办法,这里头住的可都是纳税大户...

  • 算法-爬楼梯问题

    一个N阶的楼梯,每次能1或着2阶,问走n阶的楼梯有多少种走法? 分析可知在走第n阶的时候,是与第n-1阶和n-2阶...

  • 解答牛顿爬楼梯问题

    今天面试遇到了这个题,脑子轴了一下, 没有答上来, 事后想了想, 其实也是蛮简单的问题 牛顿爬楼梯.png 爬楼梯...

  • LeetCode:70. 爬楼梯

    问题链接 70. 爬楼梯[https://leetcode-cn.com/problems/climbing-st...

网友评论

  • 逸之:@yigoh 再仔细一看,貌似第二份没有函数递归,鼓掌。
  • yigoh:@逸之 重复利用资源少。至少第一个在codepad.org上跑出的是“time out”,第二个能出结果。
  • 逸之:请教:第二份代码快在哪里?
  • LostAbaddon:我首先想到的诗:这是一个排列组合问题,等于下面这东西的求和:
    (n-2i-j)!/i!/j!/(n-3i-2j)!
    其中i从0遍历到[n/3],j从0遍历到[(n-3i)/2],[]为高斯符号,表示取整。而被求和的东西,就是丛n-2i-j个东西中选择i个作为3,选择j个作为2,剩下的作为1,取出物排序不分先后。

    好吧,这不是程序员思维了。。。

本文标题:“小明爬楼梯”问题

本文链接:https://www.haomeiwen.com/subject/bygcxttx.html