【树形dp】| AcWing 算法基础班试题总结

285. 没有上司的舞会

题目描述

某公司有N名职员,编号为1~N。
他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。
每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。
现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。
在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。

输入格式
第一行一个整数N。
接下来N行,第 i 行表示 i 号职员的快乐指数Hi。
接下来N-1行,每行输入一对整数L, K,表示K是L的直接上司。

输出格式
输出最大的快乐指数。

数据范围
1≤N≤6000,
−128≤Hi≤127

输入样例:

7
1
1
1
1
1
1
1
1 3 //即,3->1
2 3
6 4
7 4
4 5
3 5

输出样例:

5

分析

整个公司的职员组成一棵树,每个职员就是树上的一个结点,对于每个结点,有0 1两种状态,选就是1,不选就是0。

状态表示:

f[u][0]:以结点u为根的子树,并且不选u这个点的符合要求的各种方案
f[u][1]:以结点u为根的子树,并且选择u这个点的符合要求的各种方案

属性: Max,f[u][0]或者f[u][1]的值就是各种符合要求的方案的最大值

求从u结点开始的子树满足要求的方案最大值,最终结果肯定在f[u][0]f[u][1]中选择,选择其最大值。

  1. 考虑是否选择结点u
  2. 递归地考虑父结点u各个子结点si递归结束的条件就是到达叶子结点。

以父结点u为根节点考虑 和 以子节点s为根节点考虑,这二者的方法是相同的,且相互独立的。
且父结点的值需要用到子节点的值。

假设以结点u为根节点的子树有多个子节点si,考虑它的每个子节点si,可以再看成以子节点si为根的子子树。

  1. 如果选择结点u的话,子结点si一定不能选。
    f [ u ] [ 1 ] = ∑ ( f [ s i , 0 ] ) f[u][1]=∑(f[si,0]) f[u][1]=(f[si,0])
  2. 如果不选择结点u的话,子结点可选可不选,选择其中的最大值即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值