蜜蜂爬蜂房(记忆化递归)

版权声明:转载请注明出处链接 https://blog.csdn.net/qq_43408238/article/details/88802706

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

一开始看到这个题目,首先想到的是递归,然后理所当然的超时,由于对动态规划还不是很理解,在想了许久后采用记忆化递归,减少重复次数,总算AC了

思路:通过观察发现(由3——>6举例),3可以到4,5(形成树杈,4,5为分叉); 4可以到5,6(再分支)..........就是画了个树状图,发现了一个一般规律,每个数字通过加1,加2形成树杈,一直到大于等于目标数字时停止分叉,最后所有等于目标数字的树杈个数就是答案(画个树杈图就明白了)。我也不知道自己怎么想出来的这个思路,感觉很不错。

这个题目竟然是斐波那锲数列,我去,我是怎么做的题啊(摸摸头),附上代码

 

 

 

 

j记忆化搜索代码如下:

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <set>
#include<queue>
#include <map>
#include <iomanip>
typedef long long ll;
using namespace std;
ll   slove(ll x,ll y);
ll ans[10010];
int main()
{
    ll t,n,m;
    cin>>t;
    while(t--)
    {
        memset(ans,-1,sizeof(ans));
        cin>>n>>m;ll sum=0;
         cout<< slove(n,m)<<endl;



    }

}
ll   slove(ll x,ll y)
{

     if(ans[x]!=-1) {return ans[x];}
     if(x>y) return 0;
     if(x==y) return 1;
      ans[x]=slove(x+1,y)+slove(x+2,y);
      return ans[x];



}

斐波那切数列代码如下:

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <set>
#include<queue>
#include <map>
#include <iomanip>
#define  INF  0x3f3f3f3f
typedef long long ll;
using namespace std;
ll solve(ll x);
int main()
{
    //freopen("input.txt","r",stdin);
    ll t,n,m;
    cin>>t;
    for(ll i=1;i<=t;i++)
    {
        cin>>n>>m;
        ll d=m-n;
        cout<<solve(d)<<endl;
    }
}
ll  solve(ll x)
{
   ll f[1000];
   f[1]=1,f[2]=2;
   for(ll i=3;i<=x;i++)
   {
       f[i]=f[i-1]+f[i-2];
   }
   return f[x];
}

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/88802706