树形dp+贪心
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
vector<int> g[N];
int dp[N], sz[N];
int n;
void dfs(int u) { // dfs求子树最长链的高度, 贪心策略:儿子都展开成一条链,其中最深的放在最下面
for(auto i : g[u]) {
dfs(i);
dp[u] = max(dp[u], dp[i]);
}
dp[u] += sz[u];
}
int main() {
cin >> n;
for(int i = 2; i <= n; i ++ ) {
int x;
cin >> x;
g[x].push_back(i);
sz[x] ++;
}
dfs(1);
cout << dp[1] << endl;
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
vector<int> g[N];
int n;
int dfs(int u) { // dfs求子树最长链的高度
int maxn = 0;
for(auto i : g[u]) {
maxn = max(maxn, dfs(i));
}
return maxn + g[u].size();
}
int main() {
cin >> n;
for(int i = 2; i <= n; i ++ ) {
int x;
cin >> x;
g[x].push_back(i);
}
int ans = dfs(1);
cout << ans << endl;
return 0;
}