hdu 1992-Tiling a Grid With Dominoes

来源:互联网 发布:淘宝网店打底衫长袖 编辑:程序博客网 时间:2024/05/14 07:41

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.
 

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.
 

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
3237
 

Sample Output
1 52 113 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 LLlong 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;}elseans++;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]);}}



0 0
原创粉丝点击