P1879 [USACO06NOV]玉米田Corn Fields

P1879 [USACO06NOV]玉米田Corn Fields

这道题跟互不侵犯差不多,但是数据范围更大了

对于状态压缩dp,提前枚举出转移是一种很好的优化

然后对于转移也需要仔仔细细的分析,如同期望dp

#include<cstdio>
#include<algorithm>
#include<iostream>
const int mod=1e8;
int map[20];
long long f[2][1<<12];
int b[400],tot;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int a;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&a);
            a^=1;
            map[i]=(map[i]<<1)+a;
        }
    for(int i=0;i<(1<<m);i++)
        if(!(i&(i<<1))&&!(i&(i>>1)))    b[++tot]=i;
    for(int i=1;i<=tot;i++)
        if(!(map[1]&b[i]))
            f[1][b[i]]=1;
    for(int i=2;i<=n;i++)
        for(int j=1;j<=tot;j++)
        {
            f[i&1][b[j]]=0;
            if(!(map[i]&b[j]))
                for(int k=1;k<=tot;k++)
                    if(!(b[j]&b[k])&&!(map[i-1]&b[k]))
                        f[i&1][b[j]]=(f[i&1][b[j]]+f[(i&1)^1][b[k]])%mod;
        }
    long long ans=0;
    for(int i=1;i<=tot;i++)
        ans=(ans+f[n&1][b[i]])%mod;
    printf("%lld",ans);
}

猜你喜欢

转载自www.cnblogs.com/Lance1ot/p/9379677.html