一只小蜜蜂
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
Input
输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50)。
Output
对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。
Sample Input
2
1 2
3 6
Sample Output
1
3
解题思路:我们注意到蜜蜂只能前往右侧相邻的蜂房,假设在从第1个到第n(n>2)个蜂房处有f(n)中方案,那么我们往左看,在第n个蜂房旁有第n-1和第n-2两个蜂房,且它们直接到达第n个蜂房都只有一种途径,而它们对应到达蜂房的方案数为f(n-1)和f(n-2)种,则有如下结论
f(n)=f(n-1)+f(n-2)(n>2)
对于f(1)和f(2)易知是1和2,则可推出结果。
而从第a个蜂房到第b个蜂房等价于从第1个蜂房到第(b-a)个蜂房,则所有问题迎刃而解了,则打好表即可高效解决。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<cstring>
#include<memory.h>
#include<map>
#include<iterator>
#include<list>
#include<set>
#include<functional>
using namespace std;
const int maxn=51;
long long result[51];//结果表 int装不下
int a,b;//a蜂房和b蜂房
int t; //测试用例
void init(){
//打表
result[1]=1;
result[2]=2;
for(int i=3;i<=maxn;i++)
result[i]=result[i-1]+result[i-2];
}
int main(){
init();
while(cin>>t){
while(t--){
cin>>a>>b;
cout<<result[b-a]<<endl;
}
}
return 0;
}