题目描述:
求把NM的棋盘分割成若干个12的的长方形,有多少种方案。
例如当N=2,M=4时,共有5种方案。当N=2,M=3时,共有3种方案。
输入格式
输入包含多组测试用例。
每组测试用例占一行,包含两个整数N和M。
当输入用例N=0,M=0时,表示输入终止,且该用例无需处理。
输出格式
每个测试用例输出一个结果,每个结果占一行。
数据范围
1≤N,M≤11
题目类型:状压DP
提交报告
- 第一次WA,原因是不理解
&
和==
的优先级,&
的优先级低,所以就是要(j&k)要加括号再 写==
AC代码
#include <cstring>
#include <iostream>
using namespace std;
int n,m;
const int maxn = 12,maxm = 1<<12;
long long f[maxn][maxm];
int st[maxm];
int main()
{
while(cin>>n>>m,n||m)
{
memset(f,0,sizeof f);
memset(st,1,sizeof st);
for (int i=0;i<1<<n;i++)
{
int cnt = 0;
for (int j=0;j<n;j++)
{
if(i>>j&1)
{
if(cnt&1)
{
st[i] = false;
break;
}
cnt = 0;
}
else cnt++;
}
if(cnt&1) st[i] = false;
}
//f[0][0] = 1;
f[0][0] = 1;//什么都不放
for (int i=1;i<=m;i++)
{
for (int j =0;j < 1<<n;j++ )
{
for (int k=0;k<1<<n;k++)
if ((j&k) == 0 && st[j|k] )
f[i][j] += f[i-1][k];
}
}
cout<<f[m][0]<<endl;
}
return 0;
}