玉米田复习

 1 #include<bits/stdc++.h>
 2 #define Set int
 3 using namespace std;
 4 const int mod=1e8;
 5 int n,m;
 6 Set cur[15];
 7 Set state[1500];
 8 int cnt,ans;
 9 int f[15][1500];
10  
11 inline void first_deal()
12 {
13     Set sum=1<<n;
14     for(Set i=0;i<sum;i++)
15         if( !(i&(i<<1)) ) state[++cnt]=i; 
16 }
17  
18 inline bool fit(int x,int k)
19 {
20     return !(state[x]&(~cur[k]));
21 } 
22  
23 int main()
24 {
25     scanf("%d%d",&m,&n);
26     int x;
27     first_deal(); 
28     for(int i=1;i<=m;i++)
29         for(int j=n-1;j>=0;j--){
30             scanf("%d",&x);
31             if(x) cur[i]|=(1<<j);//把can的第j位设置为0; 
32         }
33     for(Set i=1;i<=cnt;i++)
34         if(fit(i,1)) f[1][i]=true;
35     for(int i=2;i<=m;i++)
36         for(int j=1;j<=cnt;j++)  //枚举当前状态编号 
37         {
38             if(!fit(j,i)) continue;
39             for(int k=1;k<=cnt;k++) //枚举上一层可行状态编号 
40             {
41                 if(!fit(k,i-1)) continue;
42                 if(!(state[j]&state[k])) 
43                     f[i][j]=(f[i][j]+f[i-1][k])%mod;
44             }
45         }
46     for(int i=1;i<=cnt;i++)
47         ans=(ans+f[m][i])%mod;
48     printf("%d",ans);
49     return 0;
50 }

 

posted @ 2019-01-22 14:31  陈星卿  阅读(147)  评论(0编辑  收藏  举报