装压DP模板题

做法

为第行状态为时的方案数量, , 答案为

CODE

#include <algorithm>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <list>
#include <map>
#include <iomanip>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define int long long
#define I inline
#define ri register int
#define lowbit(x) x & -x
#define For(i , x , y) for(ri i = x ; i <= y ; ++ i)
#define Next(i , x) for(ri i = head[x] ; i ; i = e[i].nxt)
I int read() {
    int s = 0 , w = 1; char ch = getchar();
    while(ch < 48 || ch > 57) {if(ch == '-') w = -1; ch = getchar();}
    while(ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48) , ch = getchar();
    return s * w;
}
const int P = 100000000;

int n , m , tot , a[13] , f[13][1 << 12] , state[1 << 12];

I bool judge(int x , int y) {
    For(i , 0 , m - 1)    if( !((x >> i) & 1 ) && ((y >> i) & 1)) return 0;
    return 1;
}
signed main() {
    while(scanf("%d%d",&n,&m) != EOF) {
        memset(a , 0 , sizeof(a));
        memset(f , 0 , sizeof(f)) ; 
        tot = 0;
        For(i , 1 , n) 
            For(j , 1 , m) {    
                int x = read() ; 
                a[i] = ( a[i] << 1 ) | x; 
            }

        For(i , 0 , (1 << m) - 1)
            if( !( i & (i >> 1) ) ) state[++ tot] = i;
    //    For(i , 1 , n) printf("%d**\n" , a[i] ^ state) ; 
        For(i , 1 , tot) f[1][state[i]] = 1;

        For(i , 2 , n)
            For(j , 1 , tot)
                if(judge(a[i - 1] , state[j])) {
                //    puts("*");
                    For(k , 1 , tot)
                        if(judge(a[i] , state[k]))
                            if( ! (state[j] & state[k]) ) (f[i][state[k]] += f[i - 1][state[j]] ) %= P; 
                }
        int Ans = 0;
        For(i , 1 , tot) (Ans += f[n][state[i]]) %= P;
        cout << Ans << endl;
    }
    return 0;
}