树上背包复杂度分析
我一直以为树上背包的复杂度为\(O(nm^2)\)
而其实应该是\(O(nm)\)
以为\(sz\)为\(m\)的最多\(n/m\)个,所以计算次数为\(n/m*m^2=nm\)
而树上背包不应该这么写
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(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]];
}
这样就是对的
参考链接
不摆烂了,写题