状态压缩dp入门-铺砖问题


                              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;
    }
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值