HDU-OJ2041解题心得

(原MyBlog

题目描述

Problem Description

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

Input

输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

Output

对于每个测试实例,请输出不同走法的数量

Sample Input
  • 2
  • 2
  • 3
Sample Output
  • 1
  • 2
原题链接Problem-2041

题目分析

刚看到这道题目的时候,瞬间就懵了,这是什么玩意儿?

认真分析了过后,感觉这道题目就是考的排列组合,(哦,原来是这样)

搜索了下所学的知识,还真没有这种类型的解题策略,顶多就是在数学课上边学习到的一些关于排列组合的知识
如果不是很懂排列组合的同学,推荐看看用例子理解排列组合及基本公式如何计算

那么现在我们回归本题,这道题目无非就是叫我们求解一道排列组合的问题,那么我们可以通过计算机进行暴力求解了(暴力大法好呀)

但是聪明的你肯定不会傻到真的一个一个的暴力吧,那么就让我们来找下有没有什么更简单点的方法吧。

我们这样理解:(中间的单元代表列举的可行解,11即代表走一阶在走一阶,2则代表走二阶)

  • n=1 1 1
  • n=2 11、2 2
  • n=3 111、12、21 3
  • n=4 1111、112、121、211、22 5

从前面看出,s[n]=s[n-1]+s[n-2]

没错这就是我们熟悉的斐波那契数列

那么我们就可以很容易的写出代码出来了不是、、、

源代码

#include <iostream>
using namespace std;
int main ()
{
    int n;
    cin>>n;
    int fab[45]={1,1};
    for(int i=2;i<=42;i++){
        fab[i]=fab[i-1]+fab[i-2];       
    }
    for(int i=0;i<n;i++){
        int temp;
        cin>>temp;
        cout<<fab[temp-1]<<endl;
    }
    return 0;
}

当然,这个代码是做了相应的优化的,我们先进行了计算出斐波那契数列的前n项存储在一个容器当中,然后在输入了相应的数据后,直接根据数据当作下表进行输出,这样就会节省很多时间,避免出现超时的情况出现,在算法竞赛中,对时间的限制很苛刻

小结

通过这个题目的实现,了解到我们平时所学习的经典的数学知识和一些算法的应用的强大,所以我们在平时还是应该多多积累算法,在真正理解算法的基础上再进一步的进行应用,或许会有另外一番风景。

在解答一个问题的时候,多方面的思考问题的解答方案,或许你会找到一个更好更优的解决方案

交友栏目

更多IT相关咨询请关注微信公众号 DeepBlueTeam ,或关注QQ群 577047300(I&T)欢迎各位小伙伴的加入。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值