剑指offer:(8-10)斐波那契数列的应用——跳台阶和矩阵覆盖问题

关于斐波那契数列的相关解法在前面已写过,不再多说,主要介绍相关应用的题,其本质均为斐波那契数列,只是“穿了个马甲”而已。


8.跳台阶

问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

a.由题意可知,只有两种跳法,1阶或者2阶。那么假定第一次跳的是一阶,那么剩下还有n-1个台阶,跳法是f(n-1);

b.假定第一次跳的是2阶,那么剩下还有n-2个台阶,跳法是f(n-2)

c.由a和b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2) ,即先跳一阶和假如先跳两阶两种情况的跳法总数。

d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2

e.可以发现最终得出的是一个斐波那契数列:

f(n)=\left\{\begin{matrix} &1,n=1\\ &2,n=2\\ & f(n-1)+f(n-2),&(n>2,&n\quad is &an& integer) \end{matrix}\right.

class Solution {
public:
    int jumpFloor(int number) {
        if(number<=0) return 0;
        int f1=1,f2=1;
        while(number--){
            f2=f1+f2;
            f1=f2-f1;
        }
        return f1;
    }
};

9.变态跳台阶

题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:

f(1) = 1

f(2) = f(2-1) + f(2-2)         //f(2-2) 表示一共2阶,第一次跳2阶后的跳法数。

f(3) = f(3-1) + f(3-2) + f(3-3) 

...

f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n) 

说明: 

1)这里的f(n) 代表的是n个台阶第一次跳1,2,...n阶的 跳法数。

2)n = 1时,只有1种跳法,f(1) = 1

3) n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2) 

4) n = 3时,会有三种跳得方式,1阶、2阶、3阶,

    那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)

    因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)

5) n = n时,会有n中跳的方式,1阶、2阶...n阶,得出结论:

    f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... + f(n-1)

6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:

    f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)

    f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) = f(n-1) + f(n-1)

    可以得出:

    f(n) = 2*f(n-1)

7) 得出最终结论,在n阶台阶,一次有1、2、...n阶的跳的方式时,总得跳法为:

f(n)=\left\{\begin{matrix} &1,n=0\\ &1,n=1\\ & f(n-1)+f(n-2),&(n>=2,&n\quad is &an& integer) \end{matrix}\right.

class Solution {
public:
    int jumpFloorII(int number) {
        //递归
        /*if(number < 1 ) return -1;
        //else if(number == 1) return 1;
        else return 2*jumpFloorII(number-1);*/
        int g = 1;
        while(--number){
            g = g*2;
        }
        return g;
    }
};

10.矩阵覆盖

题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

同为斐波那契数列,竖放一个,剩下f(n-1)。

横放一个,下面那个也确定了,因为矩阵始终两行。剩下f(n-2)。

class Solution {
public:
    int rectCover(int number) {
        if(number<1) return 0;
        int j=1,g=1;
        while(number--){
            g=j+g;
            j=g-j;
        }
        return j;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
青蛙台阶问题斐波数列是经典的编程问题。我们来分别介绍一下。 1. 青蛙台阶问题 一只青蛙一次可以上1级台阶,也可以上2级。求该青蛙上一个n级的台阶总共有多少种法? 解答: 我们可以用动态规划的思想来解决这个问题。我们用f(n)来表示上n级台阶法数目。对于第一次,我们有两种选择:一级或者两级。如果第一次一级,那么剩下的n-1级台阶就有f(n-1)种法;如果第一次两级,那么剩下的n-2级台阶就有f(n-2)种法。因此,总的法数目就是f(n) = f(n-1) + f(n-2),这就是斐波数列的定义。 那么,我们可以写出如下的Python代码来实现青蛙台阶问题: ```python def jumpFloor(number): if number == 1: return 1 if number == 2: return 2 a, b = 1, 2 for i in range(3, number+1): a, b = b, a+b return b ``` 2. 斐波数列 斐波数列这样一个数列:0、1、1、2、3、5、8、13、21、34、……,在数学上,斐波数列以如下被以递归的方法定义: $$ F_0 = 0, F_1 = 1, F_n = F_{n-1} + F_{n-2} (n \geq 2) $$ 解答: 斐波数列具有很好的递归性质,因此我们可以用递归的方式来求解。另一种方法是使用动态规划的思想,用f(n)来表示第n个斐波数,那么有f(n) = f(n-1) + f(n-2)。 我们可以写出如下的Python代码来实现斐波数列: ```python def Fibonacci(n): if n == 0: return 0 if n == 1: return 1 a, b = 0, 1 for i in range(2, n+1): a, b = b, a+b return b ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值