HDU——2044 一只小蜜蜂(递推打表求解)

2 篇文章 0 订阅

一只小蜜蜂

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HeZephyr

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值