题源:一只小蜜蜂… hdu2044
题目:
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房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;题中要求只能往右走,则只能往比此刻房间号大的房间走;从1到2为1, 2到3的走法为从1到3的走法加上2到3的走法,类推从3到8:
先求3到4,再求3到5(3直接到5加上3到4的走法) 再求3到6(3到4的走法加上3到5的走法) 再求3到7(3到5的走法加上3到6的走法 ) 最后求3到8(3到6的走法加上3到7的走法);
AC代码:
#include<bits/stdc++.h>
#include<cmath>
typedef long long ll;
using namespace std;
//int a[100][100];
int a,b;
ll aa[1000];
int main()
{
int c;
scanf("%d",&c);
while(c--)
{
cin >>a>>b;
int ans=1;
aa[0]=0;
aa[1]=1;
for(int i=a+1;i<=b;i++)
{
aa[++ans]=aa[ans-1]+aa[ans-2];//类推累加
}
cout <<aa[ans]<<endl;
}
return 0;
}
今天晚上突然想到这道题,上次写这道题时,其实当时我是用的递归暴力求解,后来发现超时,就放弃了,今晚忽然想起来用记忆化搜索可以大大节省时间,为何不修改一下。试了一下,真的ac了
放代码:、
#include<bits/stdc++.h>
#include<cmath>
typedef long long ll;
using namespace std;
//int a[100][100];
int a,b;
ll dp[1000];//步数可能会爆int
ll d(int x)//此处有坑,虽然dp数组用long loong表示了,但是这个递归函数的返回值也要设置成long long
{
if(x>b) return 0;
if(dp[x]>0) return dp[x];
if(x==b) return 1;
return dp[x]=d(x+1)+d(x+2);
}
int main()
{
int c;
cin >>c;
while(c--)
{
memset(dp,0,sizeof dp);
cin >>a>>b;
cout<<d(a)<<endl;
}
return 0;
}