面试题3---走阶梯

问题描述:一个楼梯有50个台阶,每一步可以走一个台阶,也可以走两个台阶,请问走完这个楼梯共有多少种方法?举个例子,假设有3个台阶,则有三种走法:分别是,1-1-1, 1-2, 2-1。

分析:假设走完k个台阶有f(k)种走法。
  • k = 1时,f(k) = 1
  • k = 2时,f(k) = 2
  • k = n时,第一步走一个台阶,剩n-1个台阶,有f(n - 1)种走法。第一步走两个台阶,剩n-2个台阶,有f(n - 2)种走法。所以共有f(n - 1) + f(n - 2)种走法。于是有如下的公式

代码

int count(unsigned int n)
{
    if(n == 1)
        return 1 ;
    if(n == 2)
        return 2 ;
    else 
        return count(n - 1) + count(n - 2) ;
}

具体走法:

上面只给出了有多少种走法,那么具体每一种走法是怎么走的呢?比如n=4时,五种走法分别如下:

1,1,1,1

1,1,2

1,2,1

2,1,1

2,2

我们用一个整型数组来存放每一步的内容,1表示这步走了一个台阶,2表示这步走了两个台阶。回溯法搞定。代码如下。

void count(int n, int t)
{
    if(n < 0)
        return ;
    if (n == 0)
        Output(step, t) ;
    else
    {
        for (int i = 1; i <= 2; ++i)
        {
            step[t] = i ;
            count(n - i, t + 1) ;
        }
    }
}

类似问题

与此题类似的问题有很多,比如铺地砖问题,自然数拆分等

铺砖问题:

   
    
      分析一下,假设铺完长度为n的地面有f(n)种方法,如果第一块地砖竖起来铺,还剩下长度为n-1的地面,有f(n-1)种方法。如下图。
     
     如果第一块地转横着铺,那么还剩下长度为n-2的地面,有f(n-2)种铺法。如下图。
     
   所以这道题与上面的题解法完全一样。不同的题目,相同的模型而已。

自然数拆分 

    给定一个自然数n,将其拆分为若干个自然数字之和,请问有多少种方法?举个例子,n=4时,可以拆分为1-1-1-1,1-1-2,1-3,2-2。

  这题和上面的题很像,不过上面的问题是排列问题,而这题是组合问题,比如n=4时,1-1-2,1-2-1,2-1-1这三种只能算一个拆分。在上面的基础上,去掉重复的组合即可。

  转自:http://www.cnblogs.com/graphics/archive/2011/09/15/2176635.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值