POJ2411 铺砖问题

Description

有一个W行H列的棋盘,你可以在里放1*2的长方形,长方形之间互相不重叠,问放满整个棋盘有多少种方案数。

Input

输入文件有多组数据,每组数据只有一行为两个整数W和H(1<=W,H<=11)。

Output

每组数据一行为方案总数,若不能够放满整个棋盘输出0。

Sample Input

1 2 

1 3 

1 4

2 2

2 3

2 4

2 11

4 11

Sample Output

1

0

1

2

3

5

144

51205

被fft虐完又来被轮廓线dp虐~

还要复习忘了很久的状压= =

人生期望渺茫啊~

状压主要应用于某一维数据规模很小,暴搜略难写(就这道题我暴搜都不会哇┭┮﹏┭┮),对于放置相关问题,我们用01串表示状态,进行递推。

此题就是一道典型的例子,对于每个格子,我们用1表示铺砖,0表示没有铺砖。

我们发现每一行仅和其上一行放置情况有关,设f[i][j]表示前i-1行放满(可通过第i行)的j状态下的情况,有f[i][j]+=f[i-1][k],考虑以下几种情况:

//合法状态 
x11xxx   xx1xxx   x0xxx  
x11xxx   xx0xxx   x1xxx
//非法状态
x0xxx   xx10xxx   x11xx
x0xxx   xx11xxx   x10xx
//对于非法状态第三种种的11/10,我们总是从左端点判的,因此也不合法

明确了合法性判断,递推就很好进行了。

#include
using namespace std;
const int Maxn=12;
int n,m,tot;
long long f[Maxn][1<

 

你可能感兴趣的:(动态规划,状压dp)