链接
\(\text{Luogu-P1352 没有上司的舞会}\)
题意
\(\text{Ural}\)大学有\(N\)名职员,编号\(1\dots N\),它们的关系是一棵以校长为根的树,父节点即是子结点的直接上司。每个职员有一个快乐指数\(H_i\)。现在这里有一场宴会,但是没有职员愿意和直接上司一起参会,在此条件下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,输出这个最大值。
数据范围:\(1\le N \le 6000,-128\le H_i\le 127\).
分析
在树上设计动态规划算法时,一般以结点从深到浅(子树从小到大)的顺序作为\(\text{DP}\)的阶段,\(\text{DP}\)的状态表示时,第一维通常为结点编号(表示以该节点为根的子树),而第二维为从子树中选出的满足某种条件的结点的个数,第三维为选择或者不选择当前结点(所以它有\(0\)和\(1\)两种取值),有时第二维或者第三维可以省略。大多时候采用递归形式实现树形动态规划(所以\(dfs\)这时很好用),对于每个结点,先递归在它的每个子节点上\(dp\),回溯时,从子结点向结点x进行状态转移。
对于本题来说,以使用\(dp[i][0]\)表示从以\(i\)为根中的子树中选择一部分结点,并且\(i\)不选,\(dp[i][1]\)表示选\(i\);
如果结点\(x\)不选,那么它的子节点可以选也可以不选,则有 \[dp[x][0]=\displaystyle \sum_{y\in Son(x)}\max\{dp[y][0],dp[y][1]\}\]
\(Son(x)\)表示\(x\)的子节点集合,如果\(x\)选,那么它的子节点一定不能选,则有: \[dp[x][1]=H_x+\displaystyle \sum_{y\in Son(x)}dp[y][0]\]
此题我们还需要找出这棵树的根。另外,树形\(dp\)是一种很优美的动态规划。
代码
1 |
|
```