POJ 3254 Corn Fields (状压DP入门)

http://poj.org/problem?id=3254

状压DP:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 int dp[13][1<<13];
 6 int mp[13],s[1<<13];
 7 int n,m;
 8 
 9 int check1(int x)
10 {
11     return x&(x<<1);
12 }
13 
14 int check2(int x,int p)
15 {
16     return mp[x]&p;
17 }
18 
19 int main()
20 {
21     cin>>n>>m;
22     memset(dp,0,sizeof(dp));
23     memset(mp,0,sizeof(mp));
24     memset(s,0,sizeof(s));
25     for (int i=1;i<=n;i++)
26     {
27         for (int j=1;j<=m;j++)
28         {
29             int x;
30             cin>>x;
31             if (x==0) mp[i]+=1<<(j-1);
32         }
33     }
34     int cut=0;
35     for (int i=0;i<(1<<m);i++)
36     {
37         if (!check1(i)) s[cut++]=i;
38     }
39     for (int i=1;i<=n;i++)
40     {
41         for (int j=0;j<cut;j++)
42         {
43             if (check2(i,s[j])) continue;
44             if (i==1)
45             {
46                 dp[1][j]=1;
47                 continue;
48             }
49             for (int k=0;k<cut;k++)
50             {
51                 if (s[j]&s[k]) continue;
52                 dp[i][j]+=dp[i-1][k];
53             }
54         }
55     }
56     int ans=0;
57     for (int i=0;i<cut;i++)
58     {
59         ans=(ans+dp[n][i])%100000000;
60     }
61     cout<<ans<<endl;
62 }
原文地址:https://www.cnblogs.com/pblr/p/5279910.html