HDU2044----一只小蜜蜂

Problem Description

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房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
设数组f[50]存储从蜂房1到达蜂房n的可能路线数

思路问题:
   1.若是没有提示该问题是一个Fibonacci数列,我可能没有找规律数列的概念。           
       2.认为从蜂房a到蜂房b的可能路线数是由f[b]-f[a]及其它常数所组成的复杂函数式,而没有发现从蜂房a到蜂房b的可能路线数与从蜂房1到蜂房(b-a)的路线数是相同的,也未能找出相应的复杂函数式,因此最初未能解决问题。
           启发:若是自己的思路难到无法分析下去,就要换个思路思考,一切从简。

    编程问题:

   借鉴别人的思路后,编程仍出现了一下始料未及的问题:

   1.(递归函数的递归式出错,导致堆栈溢出)

 
   
int ff(int n)
{
	if(n==1||n==2) return 1;
	return ff(n-1)+ff(n-2); 
}
解决:
int ff(int n)
{
	if(n==1||n==2) return 1;
	return ff(n-1)+ff(n-2); 
}
2.(提交时,递归函数超时,后来知道不用递归也行,直接循环生成数组f)
解决:(记忆化)
memset(f,-1,sizeof(f));
int ff(int n)          
{
	if(f[n]>0) return f[n];
	if(n==1||n==2) return f[n]=1;
	return f[n]=ff(n-1)+ff(n-2);
}

   3.(数据过大溢出,导致Wrong Answer)(一直都没注意,没有意料到使用int类型会溢出,未估测数据大小)

   问题代码:

 
 
int a,b,f[50] = {0,1,2};

   解决:

long long a,b,f[50] = {0,1,2};

  完整代码:

 
 
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 50;

long long f[maxn] = {0,1,2};     
int main()
{
    int kase;
    long long a,b;
    cin>>kase;
    for(int i=3;i<maxn;i++)
    {
	    f[i]=f[i-1]+f[i-2];
    } 
	while(kase--)
	{
		cin>>a>>b;
		cout<<f[b-a]<<endl;
	}
	return 0;
}

  启发:

  1.题中有无限延长的数据时要找规律,考虑问题一切从简。

  2.编程前要估计数据的大小,选择合适的数据类型。


猜你喜欢

转载自blog.csdn.net/hushanshan520/article/details/80019698