标签:ems table ber long put other typedef cond others
2 3
5
题意:
有1*2的砖块和2*2但缺一个角的砖块,用他们恰好铺满m*n的矩形有几种方案。
代码:
//思路就是:状压,从上到下铺dfs,sta表示本行的状态,next表示下一行的状态,每次要把sta铺满 //sta,next随之变化。最后要m+1行的状态为0才可以。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; ll dp[11][1<<10]; int n,m; bool chak(int sta,int x){ int tmp=(sta&(1<<x)); return !tmp; } void dfs(int sta,int next,int col,int row,ll w){ if(col==n){ dp[row+1][next]+=w; return; } if(sta&(1<<col)) dfs(sta,next,col+1,row,w); //不放 else{ int st=(sta|(1<<col)); if(chak(next,col)){ dfs(sta|(1<<col),next|(1<<col),col+1,row,w);//竖着的1*2 if(col+1<n&&chak(sta,col+1)) dfs(st|(1<<(col+1)),next|(1<<col),col+1,row,w);//缺右上角的2*2 st=(next|(1<<col)); if(col+1<n&&chak(next,col+1)) dfs(sta|(1<<col),st|(1<<(col+1)),col+1,row,w);//缺右下角的2*2 if(col-1>=0&&chak(next,col-1)) dfs(sta|(1<<col),st|(1<<(col-1)),col+1,row,w);//缺左下角的2*2 } st=(sta|(1<<col)); if(col+1<n&&chak(sta,col+1)){ dfs(st|(1<<(col+1)),next,col+1,row,w);//横着的1*2 if(chak(next,col+1)) dfs(st|(1<<(col+1)),next|(1<<(col+1)),col+1,row,w);//缺左上角的2*2 } } } int main() { while(scanf("%d%d",&m,&n)==2){ memset(dp,0,sizeof(dp)); dp[1][0]=1; int N=(1<<n); for(int i=1;i<=m;i++){ for(int j=0;j<N;j++){ if(dp[i][j]) dfs(j,0,0,i,dp[i][j]); } } printf("%lld\n",dp[m+1][0]); } return 0; }
标签:ems table ber long put other typedef cond others
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/6690235.html