跳台阶问题(矩形覆盖问题)

跳台阶问题

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

一个递归问题,我们可以这样想:

  1. 对于一个n级台阶,假设有f(n)种跳法。
  2. 如果第一次跳了1级,那么剩下n-1级就有f(n-1)种跳法
  3. 如果第一次跳了2级,那么剩下n-2级就有f(n-2)种跳法

因为先后次序不同算不同结果,所以只有这两种方式,即f(n)=f(n-1)+f(n-2)种跳法。

递归出口:当n=1时,只有一种跳法;当n=2时,有两种跳法(1,1和2)。

Demo:

int jumpFloor(int number) 
{
    if (number <= 0) return -1;
    else if (number == 1) return 1;
    else if (number == 2) return 2;
    else return jumpFloor(number-1) + jumpFloor(number-2);
}

 

变态跳台阶问题

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

在上个问题的基础上,增加了可以跳1-n级。

  1. 对于一个n级台阶,假设有f(n)种跳法。
  2. 如果第一次跳了1级,那么剩下n-1级就有f(n-1)种跳法
  3. 如果第一次跳了2级,那么剩下n-2级就有f(n-2)种跳法
  4. 如果第一次跳了3级,那么剩下n-3级就有f(n-3)种跳法
  5. ……
  6. 如果第一次跳了n级,那么剩下n-n级就有f(n-n)种跳法

所以f(n) = f(n-1) + f(n-2) + … + f(n-n) = f(0) + f(1) + … + f(n-1)

f(n-1) = f(n-1-1) + f(n-1-2) + … + f(n-1-n+1) = f(0) + f(1) + … + f(n-2)

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

递归出口:当n=1时,只有一种跳法。

Demo:

int jumpFloorII(int number) 
{
    if (number <= 0) return -1;
    else if (number == 1) return 1;
    return 2 * jumpFloorII(number-1);
}

 

矩形覆盖问题

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

这个问题和跳台阶问题完全相同,我们只需要考虑大矩形的n那一边,而2那一边就算横着放,放俩就得了。

Demo同一。

你可能感兴趣的:(C++)