首页 > 其他分享 >[Luogu P8744] 左孩子右兄弟 题解

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

时间:2023-08-04 21:12:53浏览次数:43  
标签:dots cnt 题解 long dp Luogu P8744 节点 DP

题目大意

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

解决思路

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

状态

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

转移

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

目标状态

根节点编号为 \(1\) ,所以整个算法的 目标状态 为 \(dp_1\)。

Code & 解析

#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;
}

标签:dots,cnt,题解,long,dp,Luogu,P8744,节点,DP
From: https://www.cnblogs.com/atronomia/p/problem-solution-of-luogu8744.html

相关文章

  • 【题解】[2023牛客多校] Distance
    题目传送门:[2023牛客多校]Distance题意对于任意两个元素个数相同的set:A、B,每次可以执行以下两种操作之一:将A中的任意元素加一将B中的任意元素加一\(C(A,B)\)含义为将\(A、B\)改变为完全相同的set所需要花费的最小次数;初始给你两个set:\(S、T\),计算\(\sum_{A\subs......
  • P4795 [BalticOI 2018] 基因工程 题解
    题目传送门:Click。蒟蒻看见这道题,想了足足一个小时,过后顿有所悟,故作此篇。首先,看到题目,光是数据就已经达到了\(\operatorname{O}(nm)\)的级别,再看一看数据范围:\(3\leqn,m\leq4,100\)。显然是一道时间复杂度为\(\operatorname{O}(n,m)\)级别的题目。本蒟蒻首先观察了样......
  • 暑期竞赛培训 Day 16 <继续写题解>
    -[1][蓝桥杯2013省A]剪格子洛谷P8601题目描述如图\(1\)所示,\(3\times3\)的格子中填写了一些整数。我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是\(60\)。本题的要求就是请你编程判定:对给定的\(m\timesn\)的格子中的整数,是否可以分割为两个部分,使......
  • P4169 题解
    题意二维平面上有\(n\)个点,给你\(m\)次操作,每次操作可以插入一个点或者询问所有点中距离给定点最近的哈密顿距离。\(n,m\le3\times10^5.\)分析这是一道K-DTree的裸题。而对于这道题,我们还需要考虑插入操作。我们给出两种方式:按很多题解的思路,在这棵树上直接按普通......
  • AT_ttpc2015_g 题解
    洛谷的RMJ总是UKE,所以这一题是在ATcoder上做的,记录一,记录二。思路一首先字符串长度一定是\(6\)的倍数,然后判断是否只有\(t\)、\(i\)、\(e\)、\(c\)、\(h\)这五个字符,最后统计一下字符个数就行了。代码(错误):#include<iostream>#include<string>usingnamespacestd;......
  • UVA333 题解
    ##大意:给定一个字符串$s$判断$s$是否符合要求。1.由数字,`-`和大写英文数字`X`,空格组成,`X`代表$10$且只能在最后出现。2.依次相加前面的数字的总和可以被$11$整除,也就是前缀和,而且刚好$s$只有$10$个数字。---##坑点:1.`\r`换行与空格。你写完代码在洛谷......
  • Python爬虫遇到重定向问题解决办法汇总
    在进行Python爬虫任务时,遇到重定向问题是常见的问题之一。重定向是指在发送请求时,服务器会返回一个新的URL,将请求重新定向到该URL。为了帮助您解决这个问题,本文将提供一些实用的解决办法,并给出相关的代码示例,希望能对您的爬虫任务有所帮助。了解重定向问题重定向问题通常是由于网......
  • T1的题解
    一道小清新的思维题!和\(bocchi\)酱一样可爱的喵30pts首先典中典套路:破环成链,数组复制一份。设\(to[i]=\max(\mathbbj)(j\geqi\wedge\sum_{i\leql\leqj}a_l\leqk)\)枚举起始下标,容易想到贪心,考虑前\(i\)个已经确定好怎样分段了,下一个段一定是\([i,to[i]]......
  • P4826 [USACO15FEB] Superbull S题解
    SuperbullS题解题目传送门(可点击)题面题目描述\(Bessie\)和她的朋友们正在一年一度的\(Superbull\)锦标赛中打球,而\(Farmer\)\(John\)负责让比赛尽可能激动人心。总共有N支队伍(\(1\leN\le2000\))参加了\(Superbull\)锦标赛。每个团队都有一个\(1...2^{30}−1\)的团队ID......
  • java 同一个对象之间赋值后添加入List中,属性值相互覆盖的问题解决方案
    1、for循环中NEW对象,因为List中存的是对象的引用地址。2、BeanUtils是属于spring框架下beans包下的工具类BeanUtils它提供了对java反射和自省API的包装。它里面还有很多工具类,这篇文章我们介绍一下copyProperties这个方法使用情景一般当我们有两个具有很多相同属性的JavaBean......