即状态转移关系以树形结构为基础的dp
例题1:https://www.luogu.com.cn/problem/UVA1292
以最少的点覆盖整颗树,则dp[i][1]表示覆盖以i为根的树,选择了i节点的最少节点数,dp[i][0]则表示没选择i节点的最少节点数
1 | void dfs(int u,int fa) |
例题2:https://www.luogu.com.cn/problem/P2014
可将每棵子树看作一个容量为N的背包问题,即树形背包
1 | void dfs(int u) |
注意通过设0节点将森林变成树,0必选,故背包容量为N+1
时间复杂度为
易知在枚举背包容量时,有许多容量是不需要枚举的
1 | void dfs(int u) |
优化后时间复杂度转为
大致计算如下:考虑以u为根节点的子树,其子节点为v1、v2….
则合并时t=size[v1]*size[v1]+(size[v1]+size[v2])*size[v2]+…
t=size[u]*size[u]
其子节点合并复杂度为size[v]*size[v],远小于t,递归下去,复杂度为
感觉还是不太理解orz
参考: