POJ - 3254 Corn Fields 狀態壓縮DP/填充網格圖形

在這裏插入圖片描述

思路
在這裏插入圖片描述

代碼

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>

using namespace std;

const int N = 14, M = 1 << 12, mod = 1e8;

int f[N][M];
vector<int> h[M];
vector<int> state;
int g[N];
int n, m;

bool check(int x)
{
	for(int i = 0; i < m - 1; i++)
		if((x >> i & 1) && (x >> i + 1 & 1))
			return false;
	return true;
}

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		for(int j = 0; j < m; j++)
		{
			int t;
			cin >> t;
			g[i] += !t << j;
		
		}
	
	for(int i = 0; i < 1 << m; i++)
		if(check(i))
			state.push_back(i);
	
	for(int i = 0; i < state.size(); i++)
		for(int j = 0; j < state.size(); j++)
		{
			int a = state[i];
			int b = state[j];
			if((a & b) == 0)
			{
				h[i].push_back(j);
			}
		}
	
	f[0][0] = 1;
	for(int i = 1; i <= n + 1; i++)
		for(int j = 0; j < state.size(); j++)
		{
		    int a = state[j];
		    if(a & g[i]) continue;
		    for(int k = 0; k < h[j].size(); k++)
			{
				int b = h[j][k];
				f[i][j] += f[i - 1][b];
				f[i][j] %= mod;
			}
		}
			
	cout << f[n + 1][0] << endl;
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章