#include <iostream>
#include <cstdio>
#include <cstring>
#define MOD 100000000
using namespace std;
int n, m;
int p;
int state[1 << 12], pow[15];
int Map[15];
int dp[15][1 << 12];
void Init() {
int i;
p = 0;
pow[0] = 1;
for(i = 1; i <= m; i++)
pow[i] = pow[i - 1] * 2;
for(i = 0; i < pow[m]; i++)
if(!(i & (i << 1)))
state[p++] = i;
}
int main() {
int i, k, j, c;
scanf("%d%d", &n, &m);
Init();
for(i = 1; i <= n; i++) {
int num = 0;
for(k = 1; k <= m; k++) {
scanf("%d", &c);
num += (pow[k - 1] * !c);
}
Map[i] = num;
}
for(i = 0; i < p; i++)
if(!(state[i] & Map[1]))
dp[1][i] = 1;
for(i = 2; i <= n; i++)
for(k = 0; k < p; k++)
for(j = 0; j < p; j++)
if(!(state[k] & state[j]) && !(state[k] & Map[i]))
dp[i][k] = (dp[i][k] + dp[i - 1][j]) % MOD;
int ans = 0;
for(i = 0; i < p; i++)
ans = (ans + dp[n][i]) % MOD;
printf("%d\n", ans);
return 0;
}
poj 3254(状态压缩dp)
最新推荐文章于 2022-07-26 12:11:49 发布