跳台阶问题汇总

1. 跳台阶

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析: 递推公式如下:
f ( n ) = { 1 n = 1 2 n = 2 f ( n − 1 ) + f ( n − 2 ) n > 2 f(n)=\left\{\begin{array}{cc}1 & n=1 \\ 2 & n=2 \\ f(n-1)+f(n-2) & n>2\end{array}\right. f(n)=12f(n1)+f(n2)n=1n=2n>2

递归

class Solution {
public:
    int jumpFloor(int n) {
        if(n <= 2) return n;
        else return jumpFloor(n-1) + jumpFloor(n-2);
    }
};

非递归

class Solution {
public:
    int jumpFloor(int n) {
        if(n <= 2) return n;
        int temp, a1 = 1, a2 = 2;
        for(int i = 3; i <= n; i++){
            temp = a1 + a2;
            a1 = a2;
            a2 = temp;
        }
        return temp;
    }
};

2. 变态跳台阶

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析: 递推公式如下:
f ( n ) = { 1 n = 1 2 n = 2 4 n = 3 8 n = 4 . . . . . . f(n)=\left\{\begin{array}{cc}1 & n=1 \\ 2 & n=2 \\ 4 & n=3 \\ 8 & n=4 \\ ... & ... \end{array}\right. f(n)=1248...n=1n=2n=3n=4...
f ( n ) = 2 n − 1 f(n) = 2^{n-1} f(n)=2n1 f ( n ) = 2 f ( n − 1 ) f(n) = 2f(n-1) f(n)=2f(n1)

f ( n ) = f ( n − 1 ) + f ( n − 2 ) + ⋯ + f ( 1 ) + 1 f(n)=f(n-1)+f(n-2)+ \dots +f(1) +1 f(n)=f(n1)+f(n2)++f(1)+1
f ( n − 1 ) = f ( n − 2 ) + ⋯ + f ( 1 ) + 1 f(n-1)=f(n-2)+ \dots +f(1) +1 f(n1)=f(n2)++f(1)+1
f ( n ) = 2 f ( n − 1 ) f(n)=2f(n-1) f(n)=2f(n1)

class Solution {
public:
    int jumpFloorII(int n) {
        if(n <= 2) return n;
        else return 2*jumpFloorII(n-1);
    }
};
class Solution {
public:
    int jumpFloorII(int n) {
        if(n <= 1) return n;
        int res = 1;
        for(int i = 1; i < n; i++)
            res *= 2;
        return res;
    }
};

3. 跳台阶扩展

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析: 递推公式如下:
f ( n ) = { 1 n = 1 2 n = 2 4 n = 3 f ( n − 1 ) + f ( n − 2 ) + f ( n − 3 ) n > 3 f(n)=\left\{\begin{array}{cc}1 & n=1 \\ 2 & n=2 \\ 4 & n=3 \\ f(n-1)+f(n-2)+f(n-3) & n>3 \end{array}\right. f(n)=124f(n1)+f(n2)+f(n3)n=1n=2n=3n>3

#include <iostream>

using namespace std;

int f(int n){
    if(n<=2) return n;
    else if(n==3) return 4;
    else return f(n-1)+f(n-2)+f(n-3);

}
int main()
{
    int n;
    cin >> n;
    cout << f(n);
    return 0;
}
#include <iostream>

using namespace std;

int f(int n){
    if(n<=2) return n;
    if(n==3) return 4;
    int temp, a1=1,a2=2,a3=4;
    for(int i = 4; i <= n; i++){
        temp = a1+a2+a3;
        a1 = a2;
        a2 = a3;
        a3 = temp;
    }
    return temp;
}
int main()
{
    int n;
    cin >> n;
    cout << f(n);
    return 0;
}

m级,跳n阶台阶为:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) + ⋯ + f ( n − m ) f(n)=f(n-1)+f(n-2)+ \dots +f(n-m) f(n)=f(n1)+f(n2)++f(nm)
f ( n − 1 ) = f ( n − 2 ) + ⋯ + f ( n − m ) + f ( n − 1 − m ) f(n-1)=f(n-2)+ \dots +f(n-m)+f(n-1-m) f(n1)=f(n2)++f(nm)+f(n1m)
f ( n ) = 2 f ( n − 1 ) − f ( n − m − 1 ) f(n)=2f(n-1)-f(n-m-1) f(n)=2f(n1)f(nm1)

4. 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上m级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
   递推公式:
   f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-m)
   f(n-1) = f(n-2) + f(n-3) + ... + f(n-m) + f(n-m-1)
   化简得:f(n) = 2f(n-1) - f(n-m-1)
   
     public static int Jump4(int n,int m ) {
         //当n大于m的时候是上面的公式
         if(n > m){
             return 2*Jump4(n-1, m)-Jump4(n-1-m, m);
         }
         //当n小于等于m的时候就是和n级的相同了
         if (n <= 1) {
             return 1;
         } else {
             return 2 * Jump4(n - 1,n);
         }
     }
}

参考链接:
算法—青蛙跳台阶问题汇总

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值