状态压缩。略水。细节方面出了点问题。总是出现这样的问题,要注意下了。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define INF 1000000000
#define N 1000
int n, m;
int a[105][105];
LL dp[20][1 << 12];
int v[1 << 12];
int r[20][1 << 12];
int main(){
for(int i = 0; i < (1 << 12); i++){
if(((i << 1) & i) || ((i >> 1) & i))v[i] = 0;
else v[i] = 1;
}
while(scanf("%d%d", &n, &m) != EOF){
for(int i = 0 ; i < n;i ++){
for(int j = 0; j < m; j++)
scanf("%d", &a[i][j]);
}
memset(dp, 0, sizeof(dp));
memset(r, 0, sizeof(r));
for(int j = 0; j < n; j++)
for(int i = 0; i < (1 << m); i++){
int f = 0;
for(int k = 0; k < m; k++){
if((i & (1 << k)) && a[j][k] == 0){f = 1; break;}
}
if(f == 1)r[j][i] = 0;
else r[j][i] = 1;
}
for(int i = 0; i < (1 << m); i++){
if(!r[0][i])continue;
if(!v[i])continue;
dp[0][i] = 1;
}
for(int i = 1; i < n; i ++){
for(int j = 0; j < (1 << m); j++){
if(!v[j])continue;
for(int k = 0; k < (1 << m); k++){
if(!v[k])continue;
if(!r[i][k])continue;
if(j & k)continue;
dp[i][k] += dp[i - 1][j];
dp[i][k] %= INF;
}
}
}
LL sum = 0;
for(int j = 0; j < (1 << m); j++)
{
sum += dp[n - 1][j];
sum %= INF;
}
printf("%I64d\n", sum);
}
return 0;
}