没有上司的晚会 树型DP

来源:互联网 发布:泰兰德的记忆知乎 编辑:程序博客网 时间:2024/05/16 18:29

 

树形DP是DP中的一种,还是比较容易的。

 

一般采用树形DP,都是从叶子到根.  也有从根到叶子的听说,目前没见到。

 

做了两题

 

1.

没有上司的晚会 

 

背景 

有个公司要举行一场晚会。 

为了能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会邀请他的上司 

(上司的上司,上司的上司的上司……都可以邀请)。 

 

 

题目 

每个参加晚会的人都能为晚会增添一些气氛,求一个邀请方案,使气氛值的和最大。 

 

输入格式 

第1行一个整数N(1<=N<=6000)表示公司的人数。 

接下来N行每行一个整数。第i行的数表示第i个人的气氛值x(-128<=x<=127)。 

接下来每行两个整数L,K。表示第K个人是第L个人的上司。 

输入以0 0结束。 

 

 

输出格式 

一个数,最大的气氛值和。 

 

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

 

这一题应该是默认一个人没有两个直接上司的,所以形成的是一个树。

 

这颗树的转移方程还是比较容易想到的

 

F[i][0] 表示第i颗子树(i节点是这颗树的根,也就是其他人的上司..不一定是直接上司),i不参加

 

F[i][1] 表示i参加

 

那么

 

F[i][0] = ∑max{ F[i.son[j]][1] , F[i.son[j]][0] }他的直接下司可去可不去

 

F[i][1] = ( ∑F[i.son[j]][0] ) + S[i]他的直接下司不可去

 

其中涉及到一个问题

 

就是一个根可能有多个孩子,怎样去表示。我们发现把这颗树建立起来以后,只要能够轻松地依次遍历某个根的所有孩子就可以了。

 

所以我采用了表示兄弟的方法

 

 

 

我保存了一个根的第一个孩子和最后一个孩子,而next[i]表示i节点的下一个兄弟  没有为-1

 

father我是用来找根的

 

我用了一个递归。代码核心:

 

 

 

完整代码:

 

 

 

原创粉丝点击