(Day14) 算法复健运动for蓝桥杯-树形DP
(Day14) 算法复健运动for蓝桥杯-树形DP
树形DP顾名思义就是树形的DP(说了等于没说)
总之没什么需要讲的,来点题目,今天选的题目是蓝桥杯的,不过是省赛。
蓝桥杯2021省A luoguP8744
https://www.luogu.com.cn/problem/P8744
一道树形题目的题,不用dp数组,用搜索能解决,但是思想还是树形dp的思想
设dp[i]的含义是以i为root的子树(不包括兄弟结点),转换为二叉树的深度最多是多少。
状态转移方程就是:dp[父节点]=max(dp[子结点1],dp[子结点2]...)+该父节点的子节点数,因为根据贪心策略,最深的一定要挂在最下面才能使一棵树最深。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+9;
vector<int>ve[N];
int dfs(int x)
{
int len=ve[x].size();
int maxx=0;
for(int i=0;i<len;i++)
{
int to = ve[x][i];
maxx=max(maxx,dfs(to));
}
return maxx+len;
}
int main()
{
int n,far;
cin>>n;
for(int i=2;i<=n;i++)
{
cin>>far;
ve[far].push_back(i);
}
cout<<dfs(1)<<endl;
return 0;
}
/*
只是兄弟结点的排列问题
dp[i]:标号为i的结点以及其子树的最深
dp[i]=max(dp[],dp[])+儿子数-1
*/

浙公网安备 33010602011771号