版权声明:本文为 @iCurious
的原创文章,可以转载,但请务必注明作者和出处!!!
原文链接:|blog.csdn.net/icurious|www.blankspace.cn|www.cnblogs.com/icurious/|
Problem D: 漫长的旅程
问题描述Description
这次ACM/ICPC亚洲赛结束,我们从xx赛区要经过十分漫长的旅程才能返回xx,所以我们不得不找点有趣的事情做(比如说出这次比赛的题目…o(>﹏<)o)我们就想呀,这个火车就不能少停几站吗?当然,铁老大是不会同意滴。不过,铁老大也并非这么死板,火车沿途也不是所有站台都停靠,偶尔也是会跳过一些小站的。铁老大表示,可以跳过一些小站,但是绝对不能连续跳过两站及以上,否则又要成为众矢之的了。现在,某条线上一共有m个站台(火车初始停靠在第一站),铁老大想知道一共有多少种停站方案可供选择,你能帮助铁老大解决这个问题吗?
Input
输入数据首先包含一个整数N(N<=40),表示测试实例的个数,然后是N行数据,每行包含一个整数M(2<=M<=40),表示该线站台的数量。
Output
每组输出仅有一行,包含一个整数,表示可供选择的方案数。
Sample Input
2
2
3
Sample Output
1
2
算法/思路
本题的实质是经典的“走楼梯问题”,有一个M级的台阶,每次可以走1级或者2级,问走上台阶总共有多少种走法。
if M=1,f(M=1)=1
if M=2,f(M=2)=2,可能是从第0级,一下子走2级,或者0->1->2一次走一级。
if M=i,已经走到可第i级台阶了,那是怎么走上来的呢?可能是从第i-1级台阶走一步上来的,也可能是从第i-2级台阶走两部上来的,所以:
f(M=i)=f(M=i-1)+f(M=i-2),或者直接写成f(n)=f(n-1)+f(n-2),典型的斐波那契数列!!!
算法实现
#include<iostream>
using namespace std;
int fib(int n){return (n<=2)?1:fib(n-1)+fib(n-2);}
int main()
{int M=0,n=0;cin>>M;while(M--){cin>>n;cout<<fib(n)<<endl;}}
版权声明:本文为 @iCurious
的原创文章,可以转载,但请务必注明作者和出处!!!
原文链接:
|blog.csdn.net/icurious|www.blankspace.cn|www.cnblogs.com/icurious/|