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

问题描述:

假设你现在正在爬楼梯,楼梯有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;

}

结束语:虽然第三种方法通过了,但是由于未系统的了解算法的知识,对于他所考察的动态规划似乎没有考虑,只能日后再完善了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值