A - 骨牌鋪方格
阿新 • • 發佈:2019-01-14
A - 骨牌鋪方格
在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=1 時為 1,n=2 時 為 2 ,n=3 時 為3 ...
假設我們知道了第i-1 個和第i-2個骨牌的放置方式的數量f(i-1)和f(i-2),當我們新放入第 i 個骨牌的時候, 那麼它放置的方式有豎著放和橫著放,因為橫著放,放上面下面都是一樣的,所以這個時候這兩種情況對應的,豎著放的時候,放置的方式為 f(i-1)種;當它橫著放的時候,可以指導放置的方式有前面f(i-2)種(因為橫著放的時候,有兩個塊已經被固定住了),所以f(i) = f(i-1)+f(i-2) ,所以有遞推公式:
直接實現即可,注意要用 long long 因為最後輸出可能很大
#include<iostream> using namespace std; int main(){ const int MAXN=52; long long dp[MAXN]; fill(dp,dp+MAXN,0); int N; dp[1]=1; dp[2]=2; for(int i =3;i<=50;i++){ dp[i]=dp[i-1]+dp[i-2]; } while(scanf("%d",&N)!=EOF){ printf("%lld\n",dp[N]); } return 0; }