Problem Description
在2×n的一個長方形方格中,用一個1× 2的骨牌鋪滿方格,輸入n ,輸出鋪放方案的總數.
例如n=3時,爲2× 3方格,骨牌的鋪放方案有三種,如下圖:
Input
輸入數據由多行組成,每行包含一個整數n,表示該測試實例的長方形方格的規格是2×n (0<n<=50)。
Output
對於每個測試實例,請輸出鋪放方案的總數,每個實例的輸出佔一行。
Sample Input
1
3
2
Sample Output
1
3
2
我們知道遞推的思想就是將第n個元素加入,看對整個方案的影響
分析:
我們用f(n)表示2 * n的方格的方法數
2 * n的方格是在2 * (n-1)方格的基礎上加上一塊2 * 1的格子,而這塊2*1的方格有兩種擺法
①如果前面的n-1塊已經放好,只有一種放法,這第n塊只能豎着放一塊
②如果前面的n-2塊已經放好,只有一種放法,這第n-1~n塊可以橫着放兩塊
所以f(n)=f(n-1)+f(n-2)
#include<bits/stdc++.h>
using namespace std;
long long a[55];
int main()
{
int n;
while(cin>>n)
{
a[1]=1;
a[2]=2;
for(int i=3;i<=n;i++)
a[i]=a[i-1]+a[i-2];
cout<<a[n]<<endl;
}
return 0;
}
這題用遞歸做會超時,遞推題最好還是用遞推做。
借鑑:(這篇博客有圖解)可以看看
杭電OJ——2046 骨牌鋪方格(簡單的推斷題)
遞推算法總結:
遞推算法