在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