本文主要是介绍HDU——2044 一只小蜜蜂(递推打表求解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一只小蜜蜂
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房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;
}
这篇关于HDU——2044 一只小蜜蜂(递推打表求解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!