求优化
查看原帖
求优化
701221
Chr0n1CleC楼主2022/12/24 12:59

打了个状压,40分,而且还是压缩的 mm

打的刷表。

#include<cstdio>

inline int read()
{
	register int ret = 0;
	register bool f = 1;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		(ch == '-') ? f = 0 : 0, ch = getchar();
	while (ch >= '0' && ch <= '9')
		ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
	return f ? ret : -ret;
}

int kw[109][29];

int dp[(1 << 20) + 9];//考虑口味选择

int vis[29];

#include<cstring>

int main()
{
	register int n = read(), m = read(), k = read(), i, j, ans = 0, c, x;
	for (i = 1;i <= n;++ i)
		for (j = 1;j <= k;++ j)
			x = read(), kw[i][x] = 1, ans += vis[x] ^ 1, vis[x] = 1;
	if (ans != m)
	{
		puts("-1");
		return 0;
	}
	for (i = 1;i < (1 << m);++ i)
		dp[i] = 1e9;
	for (i = 0;i < (1 << m);++ i)
	{
		for (j = 1;j <= n;++ j)//选择买哪个
		{
			x = i;
			for (c = 1;c <= m;++ c)
				if (kw[j][c])//有糖果c
					x = x | (1 << (c - 1));
			if (dp[x] > dp[i] + 1)
				dp[x] = dp[i] + 1;
		}
	}
	printf("%d", dp[(1 << m) - 1]);
	
	return 0;
}
2022/12/24 12:59
加载中...