洛谷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 }

浙公网安备 33010602011771号