zoukankan      html  css  js  c++  java
  • 洛谷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 } 
  • 相关阅读:
    CodeForces 587A
    矩阵快速幂模板
    LCA模板
    Codeforces Round #226 (Div. 2 )
    Codeforces Round #225 (Div. 2)
    SGU132
    SRM 599 DIV 2
    POJ1038
    SGU223
    POJ1185
  • 原文地址:https://www.cnblogs.com/third2333/p/7376552.html
Copyright © 2011-2022 走看看