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 位的。

posted @ 2018-02-10 17:35  Western_Trail  阅读(105)  评论(0编辑  收藏  举报