(原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)欢迎各位小伙伴的加入。