在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

clipboard.png

Input
输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0<n<=50)。
Output
对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。

以上是最近ACM作业题中做到的一道题。找规律,发现其实就斐波那契数列(以兔子繁殖引出,又叫兔子数列):

f(0)=1;
f(1)=1;
f(n)=f(n-1)+f(n-2);(n>=2;n为正整数)

显然,就是个递归的做法。
于是我一开始的代码如下:

#include<iostream>
using namespace std;
int function(int n)//递归函数
{
   if(n==1||n==2||n==3)
        return n;
   else 
        return function(n-1)+function(n-2); 
}
int main()
{  
    int n;
    while(scanf("%d",&n)!=EOF)//函数以EOF结束
    {
        cout<<function(n)<<endl;
    }
}

结果却显示 Time Limit Exceeded,我看到这边有n<50;便想到了之前用数组存装,减少运行时间的方法。

#include<iostream>
#include<cstdlib>//我试了一下,去掉此头文件,提交的时候也显示通过。
using namespace std;
__int64 w[51]={0};//定义全局数组,存放数据。
__int64 function(int n)
{
    if(n==1)
        return w[1]=n;
    else if(n==2)
        return w[2]=n;
    else if(n==3)
        return w[3]=n;
    else if(w[n]!=0)
        return w[n];//当数据已存在数组中,直接返回数组中的数据,可节约时间。
    else 
        return w[n]=function(n-1)+function(n-2);
}
int main()
{
    
    int i=3,n;
    while(scanf("%d",&n)!=EOF)
    {
   
    cout<<function(n)<<endl;
    }
return 0;
 } 

这样提交便显示通过了。
这边再提一下,只用int型的话会出现wrong answer。好像是因为斐波那契数列数据过大,int型存储空间不够。
__int64是64位长整型(这种概念我也还没弄懂,反正就是存储空间比int还要大一点就是了。

__int64 a;
输入输出的时候用 %I64d
scanf(”%I64d”,&a);
printf(”%I64d”,a);

后来我在网上搜索,代码如下。

#include<iostream>
using namespace std;
int main()
{
 int n,i;
    __int64 a[51]={1,1,2};
    for(i=3;i<=50;i++)
 {a[i]=a[i-1]+a[i-2];}
 while(scanf("%d",&n)!=EOF)
 {printf("%I64d\n",a[n]);}
 return 0;
}

一开始就把每个数组都赋值了,我提交,也能通过。


周涛
3 声望0 粉丝