poj3254 Corn Fields

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define mod 100000000
 5 using namespace std;
 6 int dp[13][1<<12],cur[13];
 7 int can[1<<12],tot,m,n;
 8 int main()
 9 {
10     while(~scanf("%d%d",&m,&n))
11     {
12         tot = 0;
13         for(int i=0;i<(1<<n);i++)
14             if((i&(i<<1))==0) can[tot++] = i;
15         memset(cur,0,sizeof(cur));
16         memset(dp,0,sizeof(dp));
17         for(int i=1;i<=m;i++)
18         {
19             for(int j=0;j<n;j++)
20             {
21                 int num;
22                 scanf("%d",&num);
23                 if(num==0) cur[i] = (cur[i]|(1<<j));
24             }
25         }
26         for(int i=0;i<tot;i++)
27             if((cur[1]&can[i])==0) dp[1][can[i]] = 1;
28         for(int i=1;i<m;i++)
29         {
30             for(int j=0;j<tot;j++)
31             {
32                 if((can[j]&cur[i])==0)
33                 {
34                     for(int k=0;k<tot;k++)
35                     {
36                         if(((can[k]&cur[i+1])==0)&&((can[k]&can[j])==0))
37                             dp[i+1][can[k]] = dp[i+1][can[k]]+dp[i][can[j]];
38                     }
39                 }
40             }
41         }
42         int ans = 0;
43         for(int i=0;i<tot;i++)
44         {
45             ans += dp[m][can[i]];
46             ans = ans % mod;
47         }
48         printf("%d
",ans);
49     }
50 }
View Code
原文地址:https://www.cnblogs.com/NWUACM/p/6606527.html