[Luogu P8744] 左孩子右兄弟 题解

1|0题目大意

给定一棵节点个数为 N 的多叉树,求其通过"左孩子右兄弟"表示法转化成的二叉树,高度最高是多少。

2|0解决思路

首先分辨出此题目是树状DP,并了解"左孩子右兄弟"表示法的转换方式,便开始考虑DP的状态转移方程。

2|1状态

由于每个节点由 1N 编号,那么就使用 dpk 表示此时k号节点的目标状态(转化后二叉树的最高高度)

2|2转移

这里需要用到 贪心策略, 对于一个节点 k , 它的子节点为 {v1,v2,v3,,vcnt}, 那么使用贪心策略找到能作出贡献最大的的子节点 (max{v1,v2,v3,,vcnt}),再将其他的节点垫在它上面( max{v1,v2,v3,,vk}+cnt)就行了。

2|3目标状态

根节点编号为 1 ,所以整个算法的 目标状态dp1

2|4Code & 解析

#include <bits/stdc++.h> using namespace std; const int N = 100010; long long n, x, dp[N]; vector<long long> v[N]; // 保存子节点 void DP(long long x) { for (auto i : v[x]) { DP(i); // 先找出以此节点为根的最大高度 dp[x] = max(dp[x], dp[i]); // 找出最能作出贡献的,将其放在最下面 } dp[x] += v[x].size(); // 将其它的子节点叠在上面 } int main() { cin >> n; for (int i = 2; i <= n; i++) { cin >> x; v[x].push_back(i); // 压入子节点 } DP(1); // 从根节点开始访问 cout << dp[1]; // 输出最终状态 return 0; }

__EOF__

本文作者WANGYUYAO
本文链接https://www.cnblogs.com/atronomia/p/problem-solution-of-luogu-p8744.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   LG532626  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示