加载中...

3.22——926 D

926 D

限时每日一题day19。树形 \(dp\),不会qwq... 补了将近3h, 最后看b站讲解才看明白,实在太蒟蒻了。。。

做法在代码注释中写得很清楚,这里就不过多赘述了。下面写一下我对这道题 \(dp\) 状态设计之精妙的总结:

其实这个状态设计我想出来了,但一直在纠结于一个地方——在状态转移时,规定的路径是以 \(u\) 为根向下走的所有路径,但在考虑以 \(u\) 为根子树整体的合法性时,显然应当不只考虑经过 \(u\) 的路径,还要考虑不经过 \(u\) 的路径是否也合法。这就让我对最终答案为 \(dp[1][0] + dp[1][1] + dp[1][2]\) 这一点产生了怀疑。但其实可以在 \(dp\) 每个结点时,除了考虑以 \(u\) 为根向下走的所有路径结点数最大值是否为 \(j\) ,还可以再考虑经过 \(u\) 的所有路径的合法性(不再只是从 \(u\) 开始向下的路径了,也就是还要额外考虑 \(u\) 作为分叉路径 \(LCA\) 时的情况)。这样每一步的状态转移就会有所不同,但由于同时考虑了后者,就使得在 \(dp\) 到某个点时,子树内的其他点都满足了合法性。这样就只需要考虑 \(u\) 的合法性就可以了。这样层层递推,最终答案一定是 \(dp[1][0] + dp[1][1] + dp[1][2]\)

code

posted @ 2025-03-22 11:23  jxs123  阅读(6)  评论(0)    收藏  举报