标签:
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 13519 | Accepted: 7876 |
Description

Input
Output
For each test
case, output the number of different ways the given rectangle can be filled with
small rectangles of size 2 times 1. Assume the given large rectangle is
oriented, i.e. count symmetrical tilings multiple times. Sample Input
1 2 1 3 1 4 2 2 2 3 2 4 2 11 4 11 0 0
Sample Output
1 0 1 2 3 5 144 51205
Source
| 196K | 16MS |
#include<stdio.h>
#include<string.h>
#define LL __int64
LL dp[2][1<<12];
int n,m;
LL add;
void dfs(int i,int p,int pos)
{
if(pos==m)
{
dp[i][p]+=add;
return;
}
dfs(i,p,pos+1);
if(pos<m-1&&!(p&(1<<pos))&&!(p&(1<<(pos+1))))
{
dfs(i,p|(1<<pos)|(1<<(pos+1)),pos+2);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF,n||m)
{
if(n*m%2)
{
printf("0\n");
continue;
}
int rt=(1<<m)-1;
memset(dp,0,sizeof(dp));
add=1;
dfs(0,0,0);
int i,j;
for(i=1;i<n;i++)
{
memset(dp[i%2],0,sizeof(dp[i%2]));
for(j=0;j<=rt;j++)
{
if(dp[(i-1)%2][j])
{
add=dp[(i-1)%2][j];
dfs(i%2,~j&rt,0);
}
}
}
printf("%I64d\n",dp[(n-1)%2][rt]);
}
}
POJ 题目2411 Mondriaan's Dream(状压DP)
标签:
原文地址:http://www.cnblogs.com/Who-you/p/4856555.html