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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!