讲解暂无,留坑待补。
题面
求用1×2的骨牌平铺n×m的棋盘的方案数(1≤n,m≤12)。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//data ----------
#define maxn (1<<16)
int dp[2][maxn],from[maxn],to[maxn],tcnt=0,n,m;
//method ----------
void dfs(int len,int f,int t){
if(len>n)return;
if(len==n){
from[++tcnt]=f;to[tcnt]=t;return;
}
dfs(len+1,(f<<1)+1,t<<1);//no setting
dfs(len+1,f<<1,(t<<1)+1);//up down
dfs(len+2,(f<<2)+3,(t<<2)+3);//left right
}
//program ----------
int main(){
int i,j,k,cur=0;
//m=height, n=width
scanf("%d%d",&n,&m);
dfs(0,0,0);
dp[1][(1<<n)-1]=1;
for(i=1;i<=m;i++){
memset(dp[cur],0x00,sizeof(dp[cur]));
for(j=1;j<=tcnt;j++){
dp[cur][to[j]]+=dp[cur^1][from[j]];
}
cur^=1;
}
printf("%d\n",dp[cur^1][(1<<n)-1]);
return 0;
}