【讲题】Galaxy OJ 树形DP专题

树形DP专题

【题目传送门】
实际上我开始写题解的时候也没有全部A(我好弱)

T1 没有上司的舞会

  首先要设计 \(DP\) 状态:

  设 \(dp_{u,\ 0}\) 为当节点 \(u\) 不去时,以 \(u\) 为根的子树产生的最大欢乐值;
  设 \(dp_{u,\ 1}\) 为当节点 \(u\) 去时,以 \(u\) 为根的子树产生的最大欢乐值。

  我们假设现在 \(dfs\) 到节点 \(u\) ,节点 \(v\)\(u\) 的一个子节点,现在我们需要分类讨论:

  若 \(u\) 去,则 \(v\) 不可以去,即 \(dp_{u,\ 1}=\sum\ dp_{v,\ 0}\)
  若 \(u\) 不去,则 \(v\) 可去可不去,即 \(dp_{u,\ 0}=\sum\ max(dp_{v,\ 0},dp_{v,\ 1})\)

  综上所述,我们得到了正解。

  【代码】

T2 寻宝

  这是一道树上背包的题

  我们设 \(dp_{u,\ i}\) 为在以 \(u\) 为根的子树上探险 \(i\) 天,所能获得的最大价值。

  首先 \(dfs\) 遍历整一棵树,对于节点 \(u\) 和它的子节点 \(v\),为了求出 \(dp_{u,i}\) 可以这样做:
  先在 \([1,\ m]\) 枚举 \(i\),接着在 \([i,\ i-2w](w为边u \rightarrow v的边权)(没错,倒着枚举)\) 范围内枚举在以 \(v\) 为根的子树中的探险时间 \(j\)
  所以 \(dp_{u,\ i}\) 获得了值为 \(dp_{v,\ j}\) 的增益。然而 \(i\) 天没有全部用完,所以 \(dp_{u,\ i}\) 还要加上 \(dp_{u,\ i-2w-j}\)

  综上所述,状态转移方程为 \(dp_{u,i}=max\{dp_{v,j}+dp_{u,i-2w-j}\}\)

  【代码】

T3 完美服务器

  这道题是 \(T1\) 的升级版。

  我们发现这一道题的每一个节点都与它周围的节点有关系,于是我们仿照 \(T1\) 写出了状态转移方程:

  设 \(dp_{u,\ 0}\) 为当节点 \(u\) 为服务器时,以 \(u\) 为根的子树最少设置的服务器数量;
  设 \(dp_{u,\ 1}\) 为当节点 \(u\) 有一个子节点为服务器时,~
  设 \(dp_{u,\ 2}\) 为当节点 \(u\) 的父亲节点为服务器时,~

  接着是愉快的分类讨论推方程,我们的目标是求出 \(dp_{i,\ sta}\)

  若 \(sta=0\) ,就表示 \(u\) 为服务器,原式的初始值为 \(1\) 。因为 \(u\) 为服务器,那么 \(v\) 的状态只可以是服务器(0)或父亲为服务器(2),即 \(dp_{u,\ 0}=1+\sum max\{dp_{v,\ 0},\ dp_{v,\ 2}\}\)
  若 \(sta=1\) ,就表示 \(u\) 的儿子中有且仅有一个服务器。我们将状态转化一下可以得到:\(dp_{i,\ 0}\) 表示 \(i\) 是服务器,父亲和儿子都不是; \(dp_{i,\ 2}\) 表示 \(i\) 的父亲是服务器,儿子节点都不是。现在我们需要枚举 \(v\) 使得 \(u\) 的儿子中仅仅有 \(v\) 是服务器时的答案,所 以 \(dp_{i,\ 1}=min\{dp_{u,\ 2}-dp_{v,\ 1}+dp_{v,\ 0}\}\)
  若 \(sta=2\) ,就表示 \(u\) 的父亲是服务器,但儿子都不是。所以方程为 \(dp_{u,i}=\sum\ dp_{v,\ 1}\)

  综上所述,我写得有点累……

  【代码】

T4 “访问”术馆

  这一道题和 \(T2\) 是同样的做法,需要注意的是因为题目要求的是在警察赶到之前,所以答案不是 \(dp_{0,\ s}\) , 而是 \(dp_{0,\ s-1}\)

  【无代码】

T5 聚会的快乐

  这是一个披着 \(T5\) 幌子的假 \(T1\)(为什么我一直是90分?!)

  【无代码】

T6 世界杯

  【题解戳这里】

T7 有线电视网

  这道题也是树上背包,与T2有异曲同工之妙。

  设 \(dp_{u,\ i}\) 表示在以 \(u\) 为根的子树中,选 \(i\) 个用户获得的最大收益。
  假设节点 \(v\)\(u\) 的一个儿子,我们在 \(u\) 的子树中选 \(i\) 名用户,在 \(v\) 的子树中选 \(j\) 名用户,可以得到: \(dp_{u,\ i}=max\{dp_{u,\ i-j}+dp_{v,\ j}\}\) 。对于每个叶子节点 \(x\) ,都有 \(dp_{x,\ 1}=w_i\ (w_i为用户支付的钱数)\)

  \(dfs\) 之后,找到一个最大的 \(i\) 使得 \(dp_{1,\ i} \geq 0\)\(i\) 即为答案。

  【代码】

T8 重建道路

  【题解戳这里】

\(T6\)\(T8\) 的题解是大佬QSH写的~

posted @ 2020-08-04 21:42  ExplodingKonjac  阅读(352)  评论(0编辑  收藏  举报