现有n*m的一块地板,需要用1*2的砖块去铺满,中间不能留有空隙。问这样方案有多少种
标签:roman define dfs ems 描述 div mil lld oid
现有n*m的一块地板,需要用1*2的砖块去铺满,中间不能留有空隙。问这样方案有多少种
输入n,m(1<=n, m<=11)
有多组输入数据,以m=n=0结束
输出铺砖块的方案数
#include<cstdio> #include<algorithm> #include<cstring> #define rep(i,a,b) for(int i=a;i<=b;++i) using namespace std; long long n,m,num,dp[150][40970],change[40970][20]; void dfs(int l,int pre,int now) { if(l>m) return; if(l==m) { change[++num][0]=pre; change[num][1]=now; } dfs(l+1,pre<<1,now<<1|1); dfs(l+2,pre<<2,now<<2); dfs(l+1,pre<<1|1,now<<1); } int main() { //f[i][sta]琛ㄧず鍓峣琛屽~婊″绗琲+1鐨勫奖鍝? while(~scanf("%d %d",&n,&m)&&n!=0&&m!=0) { if(n>m) swap(n,m); num=0; dfs(0,0,0); memset(dp,0,sizeof(dp)); dp[0][0]=1; rep(i,1,n) { rep(j,1,num) { dp[i][change[j][1]]+=dp[i-1][change[j][0]]; } } printf("%lld\n",dp[n][0]); } }
标签:roman define dfs ems 描述 div mil lld oid
原文地址:http://www.cnblogs.com/dancer16/p/6852679.html