傻逼萌新状压 dp 求助
  • 板块P5034 果冻
  • 楼主喵仔牛奶
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/9/7 21:33
  • 上次更新2023/10/27 12:19:10
查看原帖
傻逼萌新状压 dp 求助
560516
喵仔牛奶楼主2022/9/7 21:33

rt。样例 2 输出 3

#include <bits/stdc++.h>
using namespace std;
const int N = 21;
int f[1 << N], a[N], fa[N], cnt, now, qwq, n, k;
string u, v;
map<string, int> S;
// f[i] = i 状态下(1 是直属下属,0 不是)最少的代价
int dfs(int mask, int u) { // 求 mask 状态下 u 点到根的距离
	if (mask & 1 << u) return u ? 1 : 0;
	return dfs(mask, fa[u]) + 1;
}
int main() {
	cin >> n >> k >> u, S[u] = cnt, now = qwq = 1; // now 是初始的状态,qwq 是初始是直属下属的人数
	memset(f, 0x3f, sizeof f);
	for (int i = 1; i < n; i ++) {
		cin >> u >> v, S[u] = ++ cnt;
		if (!(fa[cnt] = S[v])) now |= 1 << i, qwq ++;
	}
	f[now] = 0;
	for (int i = 0; i < 1 << n; i ++) {
		for (int j = 0; j < n; j ++)
			if ((i & 1 << j) && ((i ^ 1 << j) & 1)) {
				int s = i ^ 1 << j, t = __builtin_popcount(i) - qwq;
				if (!(s & 1)) continue;
				f[i] = min(f[i], f[s] + ((dfs(s, j) + t) & k));
			}
	}
	cout << f[(1 << n) - 1] << '\n';
	return 0;
}

2022/9/7 21:33
加载中...