我写了那么久的树形背包居然是假的
  • 板块灌水区
  • 楼主__gcd
  • 当前回复16
  • 已保存回复16
  • 发布时间2021/10/21 16:00
  • 上次更新2023/11/4 03:03:42
查看原帖
我写了那么久的树形背包居然是假的
149192
__gcd楼主2021/10/21 16:00
for(int i = head[u]; i; i = nxt[i]) {
	if(to[i] == fa)continue;
	dfs(to[i], u);
	sz[u] += sz[to[i]];
	for(int j = sz[u]; j >= 0; j--) {
		for(int k = 1; k <= min(j, sz[to[i]]); k++) {
			dp[u][j] = max(dp[u][j], dp[u][j - k] + dp[to[i]][k]);
		}
	}
}

这样链的数据会卡成 O(nm2)O(nm^2)

正确的写法是:

for(int i = head[u]; i; i = nxt[i]) {
	if(to[i] == fa)continue;
	dfs(to[i], u);
	for(int j = sz[u]; j >= 0; j--) {
		for(int k = 1; k <= sz[to[i]]; k++) {
			dp[u][j + k] = max(dp[u][j + k], dp[u][j] + dp[to[i]][k]);
		}
	}
	sz[u] += sz[to[i]];
}

我感觉我学到现在看到的所有板子都是上面那种的(

2021/10/21 16:00
加载中...