經典遞推:鋪地磚(2501)
阿新 • • 發佈:2019-02-18
Tiling_easy version
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6914 Accepted Submission(s): 5394
Problem Description 有一個大小是 2 x n 的網格,現在需要用2種規格的骨牌鋪滿,骨牌規格分別是 2 x 1 和 2 x 2,請計算一共有多少種鋪設的方法。
Input 輸入的第一行包含一個正整數T(T<=20),表示一共有 T組資料,接著是T行資料,每行包含一個正整數N(N<=30),表示網格的大小是2行N列。
Output 輸出一共有多少種鋪設的方法,每組資料的輸出佔一行。
Sample Input 3 2 8 12
Sample Output 3 171 2731
遞推題要善於找規律,其實當去計算n=3的時候就能發現這個規律。遞推公式:s[i]=s[i-1]+2*s[i-2]。
/*------------------Header Files------------------*/ #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <algorithm> #include <cstdlib> #include <ctype.h> #include <cmath> #include <stack> #include <queue> #include <deque> #include <map> #include <vector> #include <limits.h> using namespace std; /*------------------Definitions-------------------*/ #define LL long long #define PI acos(-1.0) #define INF 0x3F3F3F3F #define MOD 10E9+7 #define MAX 500050 /*---------------------Work-----------------------*/ LL s[35]; void work() { s[1]=1,s[2]=3; for(int i=3;i<=30;i++) s[i]=s[i-1]+2*s[i-2]; int T; cin>>T; while(T--) { int N; scanf("%d",&N); printf("%I64d\n",s[N]); } } /*------------------Main Function------------------*/ int main() { //freopen("test.txt","r",stdin); //freopen("cowtour.out","w",stdout); //freopen("cowtour.in","r",stdin); work(); return 0; }