ural 1018 Binary Apple Tree(树形dp | 经典)

本文深入解析了一道经典的树形dp算法题,旨在求解给定边有权值的二叉树中,砍掉部分边后保留q条边构成的子树的根节点为1时的最大权值。通过状态转移方程f(i,j)表示子树i,保留j个节点的最大权值,实现分组背包思想。最终答案为f(1,q+1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



本文出自 http://blog.csdn.net/shuangde800

---------------------------------------------------------------------------------



题目链接url-1018



题意

给一棵边有权值的二叉树,节点编号为1~n,1是根节点。求砍掉一些边,只保留q条边,这q条边构成的子树
的根节点要求是1,问这颗子树的最大权值是多少?




思路

非常经典的一道树形dp题,根据我目前做过的题来看,有多道都是由这题衍生出来的。
f(i, j) 表示子树i,保留j个节点(注意是节点)的最大权值。每条边的权值,把它看作是连接的两个节点中的儿子节点的权值。
那么,就可以对所有i的子树做分组背包,即每个子树可以选择1,2,...j-1条边分配给它。
状态转移为:
f(i, j) = max{ max{f(i, j-k) + f(v, k) | 1<=k<j} | v是i的儿子}
ans = f(1, q+1)


代码

<script src="https://code.csdn.net/snippets/787.js" type="text/javascript"></script>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值