2020牛客暑期多校训练营Groundhog and Apple Tree(树形dp,贪心)

这篇博客详细介绍了Groundhog and Apple Tree问题的解决方法,涉及树形动态规划(DP)和贪心策略。题目要求在经过带有权值的边和点时,保证生命值(Hp)始终非负,并在遍历整棵树后返回1号节点,计算最多需要休息的时间。博主分析了问题本质,定义了状态req[i]和data[i],并给出了状态转移方程。通过区分data值正负,博主提出先走data非负子树且req较小,再走data负值子树但req+data较大的策略。最后,博主分享了完整的代码实现。
摘要由CSDN通过智能技术生成

Groundhog and Apple Tree

题目描述

在这里插入图片描述

样例

input:
1
5
4 2 1 5 7
1 2 4
1 3 5
4 2 9
5 2 3
output:
23

题目大意

给定一棵树,每条边有权值,点上也有权值。现有一个初始 H p = 0 Hp=0 Hp=0的人,如果经过边,那么 H p Hp Hp减去边权,如果经过点,那么会加上点权。为了保证任何时刻 H p ≥ 0 Hp\ge 0 Hp0,他可以随时休息1分钟,然后增加1 H p Hp Hp。如果每个点的点权只能加一次,每条边只能经过两次,那么如果这个人从1号结点开始,遍历所有点回到1号结点所需要休息的最多时间是多少。

分析

我们考虑遍历整棵树意味着什么。
首先肯定是遍历根,然后挑一个子树遍历,最后回到根,然后再挑一个遍历。那么对于每个子树其实遍历的方式是一样的。所以,遍历整棵树可以分成若干棵子树的遍历。这就是树形 d p dp dp了。
那么我们要定义状态:

  • req[i] 表示 i i i结点为根的子树的答案。
  • data[i] 表示遍历 i i i的子树后 H p Hp Hp的变化,可能为负。

那么根据这个,可以写出 d a t a data data的转移式子:
d a t a [ x ] = ∑ ( d a t a [ s o n ] − 2 ∗ e . v ) + v a l [ x ] data[x]=\sum(data[son]-2*e.v)+val[x] data[x]=(data[son]2e.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值