Mondriaan's Dream & Hardwood floor
第一道题目是只有一种砖,2x1可以横着铺,可以竖着铺,问有多少种铺法
第二道是有两种砖,一种是2x1的,一种是2x2的去掉一个1x1的角也是问有多少中铺法
首先第一道我们用0 1来表示不铺和铺两种状态
每一行用01字符串表示状态
然后再转化为一个十进制数表示,就会发现复杂度变得很小
空间复杂度变得也很小
接下来我们判断什么时候可以铺
只要上下都是0或者左右连续的块都是0就可以铺
只要dfs一下即可
a代表当前的行数,b代表当前的状态
void dfs(int a,int b,int cnt){ if(cnt==m){ dp[a][b]+=ans; return ; } dfs(a,b,cnt+1); if(cnt<=m-2&&!(b&(1<<cnt))&&!(b&(1<<(cnt+1)))) dfs(a,b|(1<<cnt)|1<<(cnt+1),cnt+2);</p>}
第二道题意是有六种情况,
## # ## ## # #
# # # ## ##
判断的时候是一样的
就不做介绍了
bool judge (int x,int i){ return (x&(1<<i))==0;}//判断是否可以再第i位放
void dfs(int pos1,int pos2,ll add){ if(pos1 == (1<<m)-1){ dp[pos2]+=add; return ; } for(int i=0;i<m;i++){ if(judge (pos1,i)==0) continue; if(judge (pos1,i+1)&&i+1<m){ dfs(pos1|(1<<i)|(1<<(i+1)),pos2,add); } if(judge(pos2,i)){ dfs(pos1|(1<<i),pos2|(1<<i),add); } if(judge(pos2,i)&&judge(pos2,i+1)&&i<m-1){ dfs(pos1|(1<<i),pos2|(1<<i)|(1<<(i+1)),add); } if(judge(pos2,i-1)&&judge(pos2,i)&&i>=1){ dfs(pos1|(1<<i),pos2|(1<<i)|(1<<(i-1)),add); } if(judge(pos1,i+1)&&judge(pos2,i)&&i<m-1){ dfs(pos1|(1<<i)|(1<<(i+1)),pos2|(1<<i),add); } if(judge(pos1,i+1)&&judge(pos2,i+1)&&i<m-1){ dfs(pos1|(1<<i)|(1<<(i+1)),pos2|(1<<(i+1)),add); } break; } }