链接:https://ac.nowcoder.com/acm/contest/301/B 来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
小乐乐想要给自己搭建一个积木城堡。
积木城堡我们假设为n*m的平面矩形。
小乐乐现在手里有1*2,2*1两种地砖。
小乐乐想知道自己有多少种组合方案。
输入描述:
第一行输入整数n,m。(1<=n,m<=10)
输出描述:
输出组合方案数。
示例1
输入
复制
2 3
输出
复制
3
说明
示例2
输入
复制
1 3
输出
复制
0
示例3
输入
复制
2 5
输出
复制
8
状态压缩入门题: Poj2411 Mondriaan's Dream 铺方格
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,w;
const int maxn =15;
long long d[maxn][1<<15];
int path[5000000][2];
void get(int c,int pre,int now)
{
if(c>m)return ;
else if(c==m)
{
path[w][0]=pre;
path[w++][1]=now;
return;
}
get(c+1,(pre<<1)|1,now<<1);
get(c+1,(pre<<1),(now<<1)|1);
get(c+2,(pre<<2)|3,(now<<2)|3);
}
int main()
{
while(scanf("%d%d",&n,&m)==2&&n&&m)
{
w=0 ;
if(m>n)
swap(n,m);
get(0,0,0);
memset(d,0,sizeof(d));
d[0][(1<<m)-1]=1;
for(int i=0; i<n; i++)
for(int j=0; j<w; j++)
{
d[i+1][path[j][1]] +=d[i][path[j][0]];
}
printf("%lld\n",d[n][(1<<m)-1]);
}
return 0;
}