现在的位置: 首页 > 综合 > 正文

POJ 2663

2017年11月21日 ⁄ 综合 ⁄ 共 714字 ⁄ 字号 评论关闭

blingbling 摆砖块的第二题~~ 好吧。。。虽然代码是一样样的,就当是再梳理一下思路吧。

然后刚开始的时候RE了,不懂为什么,乱开数组,,,后来发现是每次h没有初始化成3。。。所以以后一定要不辞辛苦地初始化。

看到这道题可以用递归做,,,先mark一下,感觉看不懂,,,

#include <stdio.h>
#include <string.h>
#define  maxn 14000
#define ll __int64
ll path[300][2],tan,h,w;
ll dp[40][10];
void dfs(int d,int now,int pre)
{
    if(d>w) return;
    if(d==w)
    {
        path[tan][0]=pre;
        path[tan++][1]=now;
        return;
    }
    dfs(d+1,now<<1|1,pre<<1);
    dfs(d+1,now<<1,pre<<1|1);
    dfs(d+2,now<<2|3,pre<<2|3);
}
int main()
{
    h=3;
    while(1)
    {
        scanf("%I64d",&w);
        h=3;
        if(w==-1) break;
        if(w*h%2) {printf("0\n");continue;}
        memset(dp,0,sizeof(dp));
        if(w>h) {int t=h;h=w;w=t;}
        tan=0;
        dfs(0,0,0);
        int i,j,k;
        dp[0][(1<<w)-1]=1;
        for(i=0;i<h;i++)
            for(j=0;j<tan;j++)
            dp[i+1][path[j][1]]+=dp[i][path[j][0]];
        printf("%I64d\n",dp[h][(1<<w)-1]);

    }
    return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.