洛谷P1879 Corn Fields G

洛谷P1879  Corn Fields G

方法:

状压DP

代码:

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define mo 1000000000
 4 inline int read()
 5 {
 6     char c;int sign=1;
 7     while((c=getchar())<'0'||c>'9') if(c=='-') sign=-1;
 8     int ret=c-'0';
 9     while((c=getchar())>='0'&&c<='9') ret=ret*10+c-'0';
10     return ret*sign;
11 }
12 int ans=0;
13 struct node
14 {
15     int state[8192],num;
16 };
17 int m,n;
18 
19 int b[13];
20 int f[13][8192];
21 node a[13];
22 void pre();
23 void dp();
24 int main()
25 {
26     m=read();
27     n=read();
28     for(int i=1;i<=m;i++)
29     {
30         for(int j=1;j<=n;j++)
31         {
32             int x;
33             x=read();
34             b[i]=(b[i]<<1)+x;
35         }
36     }
37     
38     pre();
39     dp();
40     /*for(int i=1;i<=m;i++)
41     {
42         cout<<a[i].num<<endl;
43     } */
44     for(int i=1;i<=a[m].num;i++)
45     {
46         //cout<<f[m][i]<<endl;
47         ans=(ans+f[m][i])%mo;
48     }
49     cout<<ans;
50     return 0;
51 }
52 void pre()
53 {
54     for(int i=1;i<=m;i++)
55     {
56         int num=0;
57         for(int j=0;j<(1<<n);j++)
58         {
59             if((j&(j<<1))||(j&(j>>1))||(j&(~b[i])))
60             {
61                 continue;
62             }
63             num++;
64             a[i].state[num]=j;
65             //cout<<j<<endl;
66         }
67         a[i].num=num;
68     }
69 
70 }
71 void dp()
72 {
73     
74     for(int i=1;i<=a[1].num;i++)
75     {
76         f[1][i]=1;
77     }
78     for(int i=2;i<=m;i++)
79     {
80         for(int j=1;j<=a[i].num;j++)
81         {
82             for(int k=1;k<=a[i-1].num;k++)
83             {
84                 if(a[i].state[j]&a[i-1].state[k])
85                 {
86                     continue;
87                 }
88                 f[i][j]+=f[i-1][k];
89             }
90         }
91     }
92     
93     
94 }
View Code

 

posted @ 2020-09-03 14:09  lvwenhao20041015  阅读(61)  评论(0)    收藏  举报