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
用2进制的01表示不放还是放 第i行只和i-1行有关 枚举i-1行的每个状态,推出由此状态能达到的i行状态 如果i-1行的出发状态某处未放,必然要在i行放一个竖的方块,所以我对上一行状态按位取反之后的状态就是放置了竖方块的状态。 然后用搜索扫一道在i行放横着的方块的所有可能,并且把这些状态累加上i-1的出发状态的方法数,如果该方法数为0,直接continue。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n,m; __int64 dp[15][1<<11],tem; void dfs(int i,int p,int k) { if(k>=m) { dp[i][p]+=tem; return; } dfs(i,p,k+1); if(k<=m-2 && !(p&1<<k) && !(p&1<<k+1)) dfs(i,p|1<<k|1<<k+1,k+2); } int main() { int i,j; while(~scanf("%d%d",&n,&m),n+m) { memset(dp,0,sizeof(dp)); tem = 1; dfs(1,0,0); for(i = 2; i<=n; i++) { for(j = 0; j<1<<m; j++) { if(dp[i-1][j]) tem = dp[i-1][j]; else continue; dfs(i,~j&((1<<m)-1),0); } } printf("%I64d\n",dp[n][(1<<m)-1]); } return 0; }
POJ2411:Mondriaan's Dream(状态压缩),布布扣,bubuko.com
POJ2411:Mondriaan's Dream(状态压缩)
原文地址:http://blog.csdn.net/libin56842/article/details/25007053