树形dp(一)
树形dp题目总结
题目一:10. 有依赖的背包问题 - AcWing题库
题目二:1074. 二叉苹果树 - AcWing题库
解题思想:
很好的一个思想 使用体积来划分集合 然后其实思想是分组背包的思想 dfs
相当与循环n
然后循环体积 然后根据分组(子树所有可能的体积)更新。
注意事项:
有依赖的背包问题这个题目的解题思路和二叉苹果树一样,都是使用树形dp来做的,但是区别就在于这个题目的体积每个点都有,但是二叉苹果树这个题目的体积根节点没有,其余的都有,所以dp更新会有区别。
有依赖的背包问题: dp[i][j]
表示以i为根,用到体积不超过j的所有方案。
更新策略:
1 | for(int i = h[u]; i != -1;i = ne[i]){ |
二叉苹果树:dp[i][j]
表示以i为根,用到子树体积不超过j的所有方案。这样我们循环到叶子节点(没有子树)是没有意义的,这里面更新需要注意,我们dp[e[i]][0]
表示的是只选择选择一个子节点,其他不选的价值。而不是子节点都不选。所以我们的dp[x][j-k1-1]
里面是j-k1-1
,这里面需要减去一个e[i]
节点体积。
更新策略:
1 | for(int i = h[x];i != -1;i=ne[i]){ |
此文章版权归waar299所有,如有转载,请注明来自原作者!
评论