在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,以下图: ios
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;便想到了以前用数组存装,减小运行时间的方法。spa
#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还要大一点就是了。code
__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; }
一开始就把每一个数组都赋值了,我提交,也能经过。ip