关于树形DP复杂度
  • 板块学术版
  • 楼主ShwStone
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/10/12 21:04
  • 上次更新2023/11/2 14:14:14
查看原帖
关于树形DP复杂度
491204
ShwStone楼主2023/10/12 21:04

一直疑惑的问题:在树上的有父亲依赖的选点方案数如果有最多 mm 个点的限制,用这样的代码复杂度是 O(nm2)O(nm^2) :

void dfs(int u) {
    dp[u][0] = 1, dp[u][1] = 1; //边界条件可能不对,不要在意
    for (int v : tree[u]) {
        dfs(v);
        for (int i = m; i >= 0; i--) {
            for (int j = 0; j <= i; j++) {
                dp[u][i] = dp[v][j] * dp[u][j - i];
            }
        }
    }

但如果限制一下枚举范围,用这样的代码:

siz[u] = 1;
for (int v : tree[u]) {
    for (int i = 0; i <= siz[u]; i++) {
        for (int j = 0; j <= siz[v] && i + j <= m; j++) {
            (dp[i + j] += dp[u][i] * dp[v][j] % mod) %= mod;
        }
    }
    siz[u] += siz[v];
    siz[u] = min(siz[u], m);
}

时间复杂度变成了 O(nm)O(nm)。

为什么?树形DP还有其他的优化吗?

2023/10/12 21:04
加载中...