Tiling a Grid With Dominoes
Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 626 Accepted Submission(s): 476
Problem Description
We wish to tile a grid 4 units high and N units long with rectangles (dominoes) 2 units by one unit (in either orientation). For example, the figure shows the five different ways that a grid 4 units high and 2 units wide may be tiled.
Write a program that takes as input the width, W, of the grid and outputs the number of different ways to tile a 4-by-W grid.
Write a program that takes as input the width, W, of the grid and outputs the number of different ways to tile a 4-by-W grid.
Input
The first line of input contains a single integer N, (1 ≤ N ≤ 1000) which is the number of datasets that follow.
Each dataset contains a single decimal integer, the width, W, of the grid for this problem instance.
Each dataset contains a single decimal integer, the width, W, of the grid for this problem instance.
Output
For each problem instance, there is one line of output: The problem instance number as a decimal integer (start counting at one), a single space and the number of tilings of a 4-by-W grid. The values of W will be chosen so the count will fit in a 32-bit integer.
Sample Input
3 2 3 7
Sample Output
1 5 2 11 3 781
题意:在一个高为4宽为w的矩阵中,求铺满多米诺骨牌的方案数。
同 hdu-1400 一样状态压缩,0表示横的,1表示竖的,枚举16种情况依次递推下去
/*************************************************************************
> File Name: code/hdu-1992.cpp
> Author: Zz
> Created Time: 2016年09月17日 星期六 23时31分31秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<list>
using namespace std;
//#define long long LL
long long dp[1000+10][20];
bool check(int x)
{
int ans=0;
for(int i=0;i<4;i++)
{
if(x&1)
{
if(ans&1)
return false;
ans=0;
}
else
ans++;
x=x>>1;
}
if(ans&1)
return false;
return true;
}
int main()
{
int T,p=1;
scanf("%d",&T);
while(T--)
{
int n;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=0;j<16;j++)
for(int k=0;k<16;k++)
if((j&k)==0&&check(j^k))
dp[i][j]+=dp[i-1][k];
printf("%d %lld\n",p++,dp[n][0]);
}
}