洛谷P1879 [USACO06NOV]玉米田Corn Fields 状压DP

洛谷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 } 
原文地址:https://www.cnblogs.com/third2333/p/7376552.html