POJ - 3254 Corn Fields (状压dp)

#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;
}

发布了19 篇原创文章 · 获赞 19 · 访问量 674

猜你喜欢

转载自blog.csdn.net/qq_44086097/article/details/104170836