状态压缩DP基础题
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int maxn=15; 6 const int mod=100000000; 7 int num[maxn],s[200]; 8 int f[maxn][200],amoun[1<<13]; 9 int main() 10 { 11 //freopen("1.txt","r",stdin); 12 int m,n; 13 cin>>m>>n; 14 int i,j,tem; 15 amoun[0]=0; 16 for(i=1;i<(1<<n);i++) amoun[i]=amoun[i>>1]+(i&1?1:0); 17 for(i=0;i<m;i++) 18 { 19 for(j=0;j<n;j++) 20 { 21 scanf("%d",&tem); 22 if(!tem) num[i+1]|=(1<<j); 23 } 24 } 25 int tot=0; 26 for(i=0;i<(1<<n);i++) 27 if(!(i&(i<<1))) s[tot++]=i;//很妙啊 28 int w; 29 int ans=0,k; 30 f[0][0]=1; 31 for(i=1;i<=m;i++) 32 { 33 for(j=0;j<tot;j++) 34 { 35 if(!(num[i]&s[j])) 36 { 37 for(w=0;w<tot;w++) 38 { 39 if(!(s[j]&s[w])&&!(s[w]&num[i-1])) 40 f[i][j]=(f[i][j]+f[i-1][w])%mod; 41 } 42 } 43 } 44 } 45 for(j=0;j<tot;j++) 46 if(!(num[m]&s[j])) 47 if(f[m][j]) ans=(ans+f[m][j])%mod; 48 cout<<ans<<endl; 49 return 0; 50 }