#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
/*
& 全一则一, 否则 为零;
| 有一则一, 否则 为零,
~ 有一则零, 有零则一;
^ 不同则一, 相同则零;
*/
int num[13];
int n, m;
int dp[13][5000];
void input()
{
int t;
for(int i = 1; i <= n; i++)
{
num[i] = 0;
for(int j = 0; j < m; j++)
{
scanf("%d", &t);
num[i]|= t<<j;//把是一的地方设为1;
}
}
}
void solve()
{
memset(dp, 0, sizeof(dp));
for(int j = 0; j <1<<m; j++)//列举所有
{
if(!((j|num[1])^num[1])&& !(j&j>>1))
dp[1][j] = 1;
else
dp[1][j] = 0;
}
for(int i = 2; i <= n; i++)
{
for(int j = 0; j < 1<<m; j++)
{
dp[i][j] = 0;
if(!((j|num[i])^num[i])&& !(j & j>>1))
for(int k = 0; k < 1<<m; k++)
{
if(!(k&j))
{
dp[i][j] += dp[i-1][k];
dp[i][j] %= 100000000;
}
}
}
}
int ans = 0;
for(int j = 0; j < 1<<m; j++)
{
ans = (ans + dp[n][j])%100000000;
}
printf("%d\n", ans);
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF)
{
input();
solve();
}
return 0;
}
poj3254压缩dp
最新推荐文章于 2021-08-29 22:08:54 发布