棋盘DP尝试

来源:互联网 发布:淘宝指数是什么意思 编辑:程序博客网 时间:2024/05/18 02:21

讲解暂无,留坑待补。

题面

求用1×2的骨牌平铺n×m的棋盘的方案数(1n,m12)。

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