1. 程式人生 > >經典遞推:鋪地磚(2501)

經典遞推:鋪地磚(2501)

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;
}