您的位置:首页 > 编程语言 > C语言/C++

计蒜客——难题库——“爬梯子”问题

2015-11-05 13:46 429 查看
问题描述:

假设你现在正在爬楼梯,楼梯有n级。每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部?

格式:

   第一行输入一个数n(n<=50),代表楼梯的级数。

   接下来一行输出你的方法总数。

例如:

输入 5

输出 8

原题链接:http://nanti.jisuanke.com/t/16

问题分析:

这个问题的实质是求解斐波那契数列中指定位置的数值,

解决方案有以下几种:

一、递归方式

设计思路:联想到二叉树的形状跟本题极为相似,因此有以下代码;

例如

                  4

          3             2

      1     2      1     0

  0      1   0  0 

       0

      

#include<iostream>

using namespace std;

int recursion(int num,int m)

{

    if(num-1>=0)

    {

        if(num-1==0)

            m+=1;

        else

        {

            int temp=num-1;

            m=recursion(temp,m);

        }            

    }

    if(num -2>=0)

    {

        if(num-2==0)

            m+=1;

        else

        {

            int temp2=num-2;

            m=recursion(temp2,m);

        }

    }

    return m;

}

int main()

{

    int n;

    cin>>n;

    int method=0;//方法数

    int sum=0;

    method=Tree(n,sum);

    cout<<method;

    return 0;

}

二、 递归方式二

设计思路:根据斐波那契数列的递推式得出的

T(n+1)=T(n)+T(n-1);

递推结束条件:n=1 时T(n)=1,n=2 时T(n)=2

#include<iostream>

using namespace std;

int recursion(int num)

{

    if(num>2)

    {

        return recursion(num-1)+recursion(num-2);

    } 

    if(num==1)

    {

        return 1;

    }

    if(num==2)

    {

        return 2;

    }

        

}

int main()

{

    int n;

    cin>>n;

    cout<<recursion(n);

    

    return 0;

}

三、预先生成斐波那契数列,再根据所输入的数字输出对应的值

设计思路:随着递归的层数增加,递归次数变得越来越大,因此上述两种方式在运行时都超时了,不满足题目的要求。因此可以先生成一个斐波那契数列,再按照输入的数据输出对应的值。

int main()

{

    long int result[100];//用于存储已经计算过的结果

    result[0]=1;

    result[1]=2;

    int n;

    cin>>n;

    int temp=0;

    while(temp<51)

    {

        if(temp>1)

        {

            result[temp]=result[temp-1]+result[temp-2];

        }

        temp+=1;

    }

    cout<<result[n-1];

    return 0;

}

结束语:虽然第三种方法通过了,但是由于未系统的了解算法的知识,对于他所考察的动态规划似乎没有考虑,只能日后再完善了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 计蒜客 难题库