萌新求助树形 dp

P3174 [HAOI2009] 毛毛虫

@[Fее_cle6418](/user/390770) 我确实统计了啊,您仔细看一下我代码,Max 与 Semax 即是
by 一只书虫仔 @ 2021-09-03 21:59:23


@[Fее_cle6418](/user/390770) 没看懂,想请教一下,为什么要在最后更新 $f_i$,为什么不能按照我的做法在最开始循环找儿子的时候就统计呢?
by 一只书虫仔 @ 2021-09-03 22:06:11


@[一只书虫仔](/user/114914) 不知道为什么,把您的代码统计的几个if换成以下就过了: ```cpp dp[cur] += max(cnt, 1); pnt = max(pnt, Max + Semax + max(cnt - (fa==-1), 1)); ```
by S0CRiA @ 2021-09-03 22:17:22


@[Fее_cle6418](/user/390770) 哦我知道了,要统计父亲
by 一只书虫仔 @ 2021-09-04 08:47:28


@[Fее_cle6418](/user/390770) 现在 WA 了 Sub2 的第二个点,感觉跟您写的几乎没有区别啊 ```cpp void dfs (int cur, int fa) { bool isleaf = true; int cnt = 0; int Max = 0, Semax = 0; for (int p = head[cur]; p; p = e[p].v) { if (e[p].u == fa) continue; dfs(e[p].u, cur); isleaf = false; dp[cur] = max(dp[cur], dp[e[p].u]); cnt++; if (dp[e[p].u] > Max) { Semax = Max; Max = dp[e[p].u]; } else if (dp[e[p].u] > Semax) Semax = dp[e[p].u]; } if (isleaf) dp[cur] = 1; else dp[cur] += cnt; if (isleaf) pnt = max(pnt, 1); else if (fa == -1) pnt = max(pnt, Max + Semax + cnt - 1); else pnt = max(pnt, Max + Semax + cnt); } ```
by 一只书虫仔 @ 2021-09-04 08:50:30


@[一只书虫仔](/user/114914) sub2第二个点貌似长这样: ``` 2 1 1 2 ``` 具体原因我看看 qwq
by y_kx_b @ 2022-11-10 23:22:24


@[一只书虫仔](/user/114914) 错因: ``` if (fa == -1) pnt = max(pnt, Max + Semax + cnt - 1); ``` 如果这个点的 `cnt` 为 $1$,那么相当于 Semax没统计后面多减了个1。貌似链的数据都会挂掉,但具体原因我也不知道,我这题也没搞透 qwq
by y_kx_b @ 2022-11-10 23:30:49


草忽然发现帖子是14个月之前的( ~~烤谷~~
by y_kx_b @ 2022-11-10 23:31:29


|