美文网首页
上台阶问题

上台阶问题

作者: 秋语_c93a | 来源:发表于2019-03-11 16:17 被阅读0次

上台阶问题

有n阶台阶(n>0),小明一次可以上一步,或者两步,请问小明有多少种上台阶的方案?

设小明有a_n种上台阶方案,当n>2时,容易得到
a_n=a_{n-1}+a_{n-2}
下面给出四种编程思路

递归

由迭代公式很容易得到想到递归过程,代码如下

int getStep(int n) {
    if (n==1) return 1;
    if (n==2) return 2;
    return getStep(n-1) + getStep(n-2);
}

动态规划

动态规划就是将计算的中间过程保存到临时变量dp中,代码如下

int[] dp;
void setDp(int n) {
    if (dp[n]==0){
        dp[n] = getStep(n);
    }
}
int getStep(int n) {
    if (n==1) return 1;
    if (n==2) return 2;
    setDp(n-1);
    setDp(n-2);
    return dp[n-1]+dp[n-2];
}
int getStepDp(int n) {
    dp = new int[n];
    return getStep(n);
}

排列组合

该问题可以转化为
x+2y=n
所有解的全排列问题,具体代码如下

    // 该方法有数据溢出问题,需要通过分解质因数优化,在Java上调试当n>26
    int getAC(int m, int n) {
        int result = 1;
        if (n>m) {
            int temp = n;
            n = m;
            m = temp;
        }
        for (int i = m+1; i < m+n+1; i++) {
            result *= i;
        }
        for (int i = 2; i <= n; i++) {
            result /= i;
        }
        return result;
    }

    int getStepAC(int n) {
        int result = 0;
        for (int i = 0; i <= n/2; i++) {
            result += getAC(i, n-2*i);
        }
        return result;
    }

数学求解

推导数列公式得
a_n=\frac 1 {\sqrt5}\left[ \left(\frac{1+\sqrt5}{2}\right)^{n+1} - \left(\frac{1-\sqrt5}{2}\right)^{n+1} \right]
代码如下

    int getStepMath(int n) {
        double sqrt5 = Math.sqrt(5);
        double left = (1.0 + sqrt5)/2.0;
        double right = (1.0- sqrt5)/2.0;
        return (int)Math.round(Math.pow(left, n+1));
    }

相关文章

  • 上台阶问题

    楼梯有100阶台阶,上楼时可以一步上1阶,也可以一步上2阶,问共有多少种走法解析:我们现在想象自己已经站在第n级台...

  • 上台阶问题

    栗子 有一段楼梯台阶有15级台阶,以小明的脚力一步最多只能跨3级,请问小明登上这段楼梯有多少种不同的走法?() 类...

  • 上台阶问题

    上台阶问题 有n阶台阶(n>0),小明一次可以上一步,或者两步,请问小明有多少种上台阶的方案? 设小明有种上台阶方...

  • 编程笔试-上台阶问题

    题目 已知从山脚到山顶共有m个台阶,一次可爬a-b个台阶,由于年久失修,部分台阶已坏无法站立,已知坏的台阶共有n个...

  • 面试题:上台阶问题

    有次面试被问到这个:n个台阶,一次可以走1步,也可以走2步,有多少种走法。递归实现如下:

  • 动态规划之-上台阶问题

    最近在刷题,碰到了上台阶问题,据说这也是Google的面试题,今天来整理一下。 问题描述 有一楼梯共m级,若每次只...

  • 动态规划2:上台阶问题

    有一个共N级的台阶,一次可以走1级或者2级,问从平地上出发到最高点有多少中走法。 分析: 从终点来看,其走法为倒数...

  • [算法] - 上台阶问题(动态规划)

    1. 问题 有十级台阶,每次只能上一级或者两级,问一共有多少种组合。 2. 代码 3. 参考 漫画:什么是动态规划...

  • 经典DP问题合集

    一、上台阶问题 二、矩阵最小路径和 三、最长递增子序列 四、最长公共子序列 五、背包问题

  • 递归算法:上台阶算法

    1、环境配置: 系统:win10 编程语言:C++ 编译器:DevC++ 2、算法思想: 问题:上台阶问题就是每次...

网友评论

      本文标题:上台阶问题

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