#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
using namespace std;
const int N = 12, M = 1 << 12, mod = 1e8;
int G[N], dp[N][M], state[M];
int n, m, cnt = 0, tmp;
int main()
{
//初始化
memset(state, 0, sizeof state);
memset(dp, 0, sizeof dp);
for (int i = 0; i < M; i++)
if (!(i & (i >> 1)))
state[cnt++] = i;
//处理数据
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
G[i] = 0;
for (int j = 0; j < m; j++)
{
scanf("%d", &tmp);
G[i] |= tmp << j;
}
}
//先预处理第一行
for (int j = 0; state[j] <= G[0]; j++)
if (G[0] | state[j] == G[0])
dp[0][state[j]]++;
for (int i = 1; i < n; i++)
for (int j = 0; state[j] <= G[i]; j++)
if ((G[i] | state[j]) == G[i])
for (int k = 0; state[k] <= G[i - 1]; k++)
if (!(state[k] & state[j]) && ((G[i - 1] | state[k]) == G[i - 1]))
{
dp[i][state[j]] += dp[i - 1][state[k]];
dp[i][state[j]] %= mod;
}
//计算结果
int ans = 0;
for (int j = 0; state[j] <= G[n - 1]; j++)
{
ans += dp[n - 1][state[j]];
ans %= mod;
}
printf("%d\n", ans);
return 0;
}
POJ - 3254 Corn Fields (状压dp)
猜你喜欢
转载自blog.csdn.net/qq_44086097/article/details/104170836
今日推荐
周排行