HDU-2044
一只小蜜蜂…
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 86459 Accepted Submission(s): 30875
Problem Description
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
Input
输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0
解题思路:
从1-2:有1种方法 1
从1-3:有2种方法 2
从1-4:有3种方法 3
从1-5:有5种方法 5
类似的从从2-3,2-4,2-5也是类似情况。
那么两个数之间存在规律:两数相差为1时,走的方法:1。相差为2时:方法:2。相差为3时:方法:3。相差为4时:方法:5。
那么我们可以写出对应的关系如图所示:
相差:1 2 3 4 n
方法:1 2 3 5 f[n-1]+f[n-2]
可以看出方法的数列符合开头两项为1,2的斐波那契数列,设n为起点终点之差,当n > 2时,f[n] = f[n-1] + f[n-2]
代码如下:
#include <string.h>
using namespace std;
long long funtion(int x,int y)
{
int n;
n = y - x;
long long f[55];
f[1] = 1;
f[2] = 2;
if(n>2)
{
for(int i = 3;i <= n;i++)
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
int main()
{
int a,b,n;
cin>>n;
while(n--)
{
cin>>a>>b;
cout<<funtion(a,b)<<endl;
}
return 0;
}
注意细节:
斐波那契数列的第20个就已经超出了 int 型整数了,为了防止边界溢出,把数组定义成64位的 long long 型的 或则 _Int64 位的。