0
点赞
收藏
分享

微信扫一扫

B 小乐乐搭积木 状态压缩DP(哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级))


链接:​​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;
}

 

举报

相关推荐

0 条评论