首页 > 其他 > 详细

[題解](狀壓/水)luogu_P1879玉米田

时间:2019-04-18 21:54:44      阅读:110      评论:0      收藏:0      [点我收藏+]

大水題然而因為智障的錯誤调了半天......
n,m别反着输入啊......內外循環和狀態數都不等價

别的就是記錄一下每一行不可行的點,也狀壓一下,dp的時候判一下即可

#include<bits/stdc++.h>
using namespace std;
const int mod=100000000;
int n,m,tot;
int f[15][1<<12+1],c[1<<12+1];
int can[15];
int main()
{
    scanf("%d%d",&m,&n);
    for(int i=1,a;i<=m;i++)
    for(int j=1;j<=n;j++){
        scanf("%d",&a);
        if(a==0)can[i]=can[i]|(1<<(n-j));
    }
    for(int i=0;i<=(1<<n)-1;i++)
    if(!(i&(i<<1)) && !(i&(i>>1)))c[++tot]=i;
    int last,now;
    for(int i=1;i<=tot;i++){//處理第一行 
        if(c[i] & can[1])continue;
        f[1][c[i]]=1;
    }
    for(int i=2;i<=m;i++)
    for(int j=1;j<=tot;j++){
        last=c[j];if(last & can[i-1])continue;
        for(int k=1;k<=tot;k++){
            now=c[k];
            if(now & can[i])continue;
            if(now & last)continue;
            f[i][now]+=f[i-1][last];
            f[i][now]%=mod;
        }    
    }
    int ans=0;
    for(int i=0;i<=(1<<n)-1;i++){
        ans+=f[m][i];ans%=mod;
    }
    printf("%d",(ans+mod)%mod);
//    for(int i=1;i<=tot;i++)cout<<c[i]<<‘ ‘;
}

 

[題解](狀壓/水)luogu_P1879玉米田

原文:https://www.cnblogs.com/superminivan/p/10732476.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!