zoukankan      html  css  js  c++  java
  • 树形背包两种写法的复杂度分析

    大部分人的树形背包板子应该是写成下面这样的:

    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)) 的。
    可以像下面这样写,复杂度就是 (O(nm))

    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]];
    }
    
  • 相关阅读:
    Shell脚本
    数据结构 栈 java 自带的数据结构
    桃夭
    得道多助,失道寡助
    采薇
    离骚
    两小儿辩日
    鱼我所欲也
    生于忧患,死于安乐
    曹刿论战
  • 原文地址:https://www.cnblogs.com/conprour/p/15434132.html
Copyright © 2011-2022 走看看