2013-team5/andrew/13/I

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
typedef pair <LL, LL> PLL;
const int INF=1e8, MN=1e6+7;
int n,m;
LL f[20][1<<8][1<<7];

void dfs(int i,int mask,int s,int newmask,int news,int d){
    if (d>=m){
        f[i+1][newmask][news]+=f[i][mask][s];
        return;
    }
    int qd=news|(s&(1<<d));
    int qx=news|(s&(1<<(d+1)));
    if ((mask>>d)&1) dfs(i,mask,s,newmask,qd,d+1);
    else{
        if (d+1<m && !((mask>>(d+1))&1))
            dfs(i,mask,s,newmask,qx,d+2);
        dfs(i,mask,s,newmask|(1<<d),qd,d+1);
    }
}

int main(){
    freopen("solid.in","r",stdin);
    freopen("solid.out","w",stdout);
    scanf("%d%d",&n,&m);
    if (n<m) swap(n,m);
    int tmp=(1<<(m-1))-1;
    f[0][0][tmp]=1;
    dfs(0,0,tmp,0,0,0);
    for (int i=1; i<n; i++)
        for (int mask=1; mask<(1<<m); mask++)
            for (int s=0; s<(1<<(m-1)); s++)
                if (f[i][mask][s]) dfs(i,mask,s,0,0,0);
    printf("%I64d\n",f[n][0][0]);
    return 0;
}
}}}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
typedef pair <LL, LL> PLL;
const int INF=1e8, MN=1e6+7;
int n,m;
LL f[20][1<<8][1<<7];
void dfs(int i,int mask,int s,int newmask,int news,int d){
    if (d>=m){
        f[i+1][newmask][news]+=f[i][mask][s];
        return;
    }
    int qd=news|(s&(1<<d));
    int qx=news|(s&(1<<(d+1)));
    if ((mask>>d)&1) dfs(i,mask,s,newmask,qd,d+1);
    else{
        if (d+1<m && !((mask>>(d+1))&1))
            dfs(i,mask,s,newmask,qx,d+2);
        dfs(i,mask,s,newmask|(1<<d),qd,d+1);
    }
}
int main(){
    freopen("solid.in","r",stdin);
    freopen("solid.out","w",stdout);
    scanf("%d%d",&n,&m);
    if (n<m) swap(n,m);
    int tmp=(1<<(m-1))-1;
    f[0][0][tmp]=1;
    dfs(0,0,tmp,0,0,0);
    for (int i=1; i<n; i++)
        for (int mask=1; mask<(1<<m); mask++)
            for (int s=0; s<(1<<(m-1)); s++)
                if (f[i][mask][s]) dfs(i,mask,s,0,0,0);
    printf("%I64d\n",f[n][0][0]);
    return 0;
}