(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
 */

posted @ 2024-06-25 16:43  wlqtc  阅读(50)  评论(0)    收藏  举报