#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define MOD 100000000;
int n, m;
int map[20];
int dp[20][1 << 12];
int state[1 << 12];
int S=0;
bool OneNear(int x)
{
if (x&x << 1)
return false;
else
return true;
}
void SolveRow()
{
int i;
for (i = 0; i < (1 << n); i++)
{
if (OneNear(i))
{
state[S++] = i;
}
}
}
int main()
{
int i, j, k;
while (~scanf("%d%d", &m, &n))
{
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
int num;
scanf("%d", &num);
if (num == 0)
map[i] =map[i]| 1 << j;
}
}
SolveRow();
for (i = 0; i < S; i++)
{
if (!(state[i] & map[0]))
{
dp[0][i] = 1;
}
}
for (i = 1; i < m; i++)
{
for (j = 0; j < S; j++)
{
if (map[i] & state[j])
{
continue;
}
for (k = 0; k < S; k++)
{
if (map[i - 1] & state[k] || state[j] & state[k])
{
continue;
}
else
{
dp[i][j] =( dp[i][j] + dp[i - 1][k])%MOD;
}
}
}
}
int Max =0;
for (i = 0; i < S; i++)
{
Max =(Max+ dp[m - 1][i])%MOD
}
printf("%d\n", Max);
}
return 0;
}
POJ 3254(状态压缩dp)
最新推荐文章于 2018-11-02 11:52:13 发布