135 - ZOJ Monthly, August 2014 - HMachine

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<cstring>
using namespace std;
#define maxn 100005
typedef long long LL;
vector<int>G[maxn];
LL d[maxn];
int in[maxn];
LL dfs(int &cur)
{
    if(d[cur]>0)return d[cur];
    
    LL &ans=d[cur];
    ans=1;
    int n=G[cur].size();
    if(n==1)ans=max(ans,dfs(G[cur][0]));
    if(n==2)
    {
        LL tmp1=dfs(G[cur][0]),tmp2=dfs(G[cur][1]);
        ans=max(min(tmp1,tmp2)+1,max(tmp1,tmp2));
    }
    return ans;
}
int main()
{
    int n,A;
    while(~scanf("%d",&n))
    {
        for(int i=0; i<=n; i++)
        {
            G[i].clear();
            d[i]=0;
        }
        for(int i=1; i<n; i++)
        {
            scanf("%d",&A);
            G[A].push_back(i+1);
        }
        int tmp=1;
        LL ans=dfs(tmp);
        cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(dp)