没有上司的晚会【树状DP】

博客讲述了如何使用树状动态规划解决Ural大学周年庆宴会的问题,即构建以校长为根的职员关系树,确保没有职员与直接上司一同参加宴会,目标是最大化快乐指数。文章提供了输入输出示例,并解释了解题思路和代码实现。
摘要由CSDN通过智能技术生成

> Description
  Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。


> Input
第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。

> Output
输出最大的快乐指数。


> Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0

> Sample Output
5


> 解题思路
根据题意,可以弄出一个树状结构:
在这里插入图片描述
s[i][0]表示不选序号为i的职员,相反,s[i][1]表示选序号为i的职员(的最大快乐指数)。因为(如图)如果选了序号5,那就一定不能选3和4,就必须得选1、2、6、7;如果没有选5,3和4选不选都无所谓,如果3和4选的话就不能选1、2、6、7了。
在这里插入图片描述
如这一幅图(第一个数为选当前数,第二个数为不选)

然后就是领接表:f[i].x存直属上司,f[i].to存这个上司的其中一个职员。f[i].next和h的数组连用,把属于h[i]中的上司i的所有职员连在了一起,看代码理解一下。。。

序号 1 2 3 4 5 6
head 2 4 6
f.x 3 3 4 4 5 5
f.to 1 2 6 7 4 3
f.next 0 1 0 3 0 5

> 代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct ooo
{
   
	int x,to,next;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值