洛谷P1879 [USACO06NOV]玉米田Corn Fields
状压DP
需要注意的是位运算的运算等级比 == 低
1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int mod = 100000000,N = 21 ; 6 int n,m,x,all,sum ; 7 int a[N],dp[N][1<<12],bin[13],can[1<<12] ; 8 9 int main() 10 { 11 scanf("%d%d",&n,&m) ; 12 For(i,1,n) 13 For(j,1,m) { 14 scanf("%d",&x) ; 15 a[ i ] = a[ i ] * 2 + x ; 16 } 17 all = (1<<m)-1 ; 18 For(i,0,all) 19 if( (i&(i<<1))==0 ) can[++can[0]] = i ; 20 For(i,1,can[0]) 21 if( (can[ i ]|a[ 1 ])==a[1] ) 22 dp[ 1 ][ can[ i ] ] = 1 ; 23 For(i,2,n) 24 For(j,1,can[ 0 ]) { 25 if( (can[ j ]|a[ i ])>a[ i ] ) continue ; // 判断两个条件 一个是当前状态与土质不冲突, 26 //并且上下行不冲突【 27 For(k,1,can[0]) { 28 if( (can[ k ]|a[ i-1 ])>a[i-1] ) continue ; 29 if( (can[ j ]&can[ k ])==0 ) dp[ i ][can[j]]+=dp[i-1][can[k]],dp[ i ][can[j]]%=mod ; 30 } 31 } 32 For(i,1,can[0]) 33 if( (can[ i ]|a[n])==a[n] ) 34 sum+=dp[n][can[i]],sum%=mod ; 35 printf("%d ",sum) ; 36 return 0 ; 37 }