萌新刚学状压dp两天半,样例不过求助
查看原帖
萌新刚学状压dp两天半,样例不过求助
561949
syr1125楼主2023/3/28 20:47
#include <bits/stdc++.h>
using namespace std;

const int N = 13, M = (1 << N), MOD = 1e8;
long long f[N][M];
bool st[M];
vector<int> ok[M];
int n, m;
int g[N];

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

int count(int x)
{
	int ans = x & 1;
	while (x)
	{
		ans += x >> 1 & 1;
		x = x >> 1;
	}
	return ans;
} 

int main()
{
	scanf("%d %d", &n, &m);
	
	for (int i = 1; i <= n; i ++)
	{
	    for (int j = 1; j <= m; j ++)
	    {
	        int x;
	        scanf("%d", &x);
	        g[i] = g[i] << 1 | !x;
	    }
	}
	
	for (int i = 0; i < (1 << m); i ++)
	{
		st[i] = check(i);
	}
	
	for (int i = 0; i < (1 << m); i ++)
	{
		for (int j = 0; j < (1 << m); j ++)
		{
			if (st[i] && st[j] && ((i & j) == 0))
			{
				ok[i].push_back(j);
			}
		}
	}
	
	f[0][0] = 1; 
	for (int i = 1; i <= n + 1; i ++)
	{
		for (int j = 0; j < (1 << m); j ++)
		{
		    if (st[j] && !(g[i] & j))
		    {
		        for (auto k : ok[j]) 
		        {
		            if (!(g[i] & k))
		            {
		                f[i][j] = (f[i][j] + f[i - 1][k]) % MOD;
		            }
		        }
		    }
		}
	}
	cout << f[n + 1][0] << endl;
	return 0;
}
2023/3/28 20:47
加载中...