树上背包复杂度分析

我一直以为树上背包的复杂度为(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]];
}

这样就是对的

参考链接

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/15500087.html