牛客 小乐乐搭积木

链接:https://ac.nowcoder.com/acm/contest/301/B
来源:牛客网

题目描述

小乐乐想要给自己搭建一个积木城堡。
积木城堡我们假设为n*m的平面矩形。
小乐乐现在手里有1*2,2*1两种地砖。
小乐乐想知道自己有多少种组合方案。

输入描述:

第一行输入整数n,m。(1<=n,m<=10)

输出描述:

输出组合方案数。
示例1

输入

复制
2 3

输出

复制
3

说明

示例2

输入

复制
1 3

输出

复制
0
示例3

输入

复制
2 5

输出

复制
8

状压dp模板
但是之前写铺砖的时候写的很复杂,做这道题的时候看了一下别人的博客用的搜索来找转移状态,学到了。牛批。


 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 long long dp[11][1050];
 7 int to[10050][2];
 8 int num = 0;
 9 int n, m;
10 void dfs(int l,int pre, int now){
11     if(l>m)
12         return ;
13     if(l==m){
14         to[++num][0] = pre;
15         to[num][1] = now;
16         return ;
17     }
18     dfs(l+1,pre<<1,now<<1|1);
19     dfs(l+2,pre<<2,now<<2);
20     dfs(l+1,pre<<1|1,now<<1);
21 }
22 int main(){
23     scanf("%d%d",&n,&m);
24     memset(dp,0,sizeof(dp));
25     dp[0][0] = 1;
26     if(n>m)swap(n,m);
27     dfs(0,0,0);
28     for(int i=1;i<=n;i++){
29         for(int j=1;j<=num;j++){
30             dp[i][to[j][1]] += dp[i-1][to[j][0]];
31         }
32     }
33     printf("%lld\n",dp[n][0]);
34     return 0;
35 }
View Code

猜你喜欢

转载自www.cnblogs.com/kongbb/p/10066443.html