Nyoj 515 完全覆盖 II

来源:互联网 发布:魔域单机版源码 编辑:程序博客网 时间:2024/05/19 04:27

详细可以参考:http://blog.csdn.net/hearthougan/article/details/22077391

#include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef long long LL;LL dp[12][1<<12];int m, k;void Pre_Slove(int j, int curstatus){    if(j >= m)    {        dp[0][curstatus]++;        return ;    }    if(j+1 <= m)//要么不放        Pre_Slove(j+1, curstatus<<1);    if(j+2 <= m)//要么横放        Pre_Slove(j+2, curstatus<<2|3);    return ;}void DFS(int j, int curstatus, int prestatus){    if(j >= m)    {        dp[k][curstatus] += dp[(k+1)%2][prestatus];        return ;    }    if(j+1 <= m)    {        DFS(j+1, curstatus<<1|1, prestatus<<1);        DFS(j+1, curstatus<<1, prestatus<<1|1);    }    if(j+2 <= m)        DFS(j+2, curstatus<<2|3, prestatus<<2|3);    return ;}int main(){    int n;    while(scanf("%d %d", &n, &m) && (m+n))    {        if(m*n % 2)        {            printf("0\n");            continue ;        }        if(n < m)        {            n ^= m;            m ^= n;            n ^= m;        }        memset(dp, 0, sizeof(dp));        Pre_Slove(0, 0);        for(int i = 2; i <= n; ++i)        {            k = (i+1)%2;            DFS(0, 0, 0);            memset(dp[(k+1)%2], 0, sizeof(dp[0]));        }        printf("%lld\n", dp[(n+1)%2][(1<<m) - 1]);    }    return 0;}


0 0
原创粉丝点击