제출 #798275

#제출 시각아이디문제언어결과실행 시간메모리
798275tch1cherinCat in a tree (BOI17_catinatree)C++17
0 / 100
1 ms340 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1505; vector<int> G[MAX_N]; int dp[MAX_N][MAX_N] = {}; int N, D; void DFS(int u) { dp[u][0] = 1; for (int v : G[u]) { DFS(v); dp[u][0] += dp[u][D - 1]; } int deg = (int)G[u].size(); for (int d = 1; d <= N; d++) { if (d * 2 < D) { vector<int> pref(deg + 1), suff(deg + 1); for (int i = 0; i < deg; i++) { pref[i + 1] = pref[i] + dp[G[u][i]][D - d - 1]; } for (int i = deg; i > 0; i--) { suff[i - 1] = suff[i] + dp[G[u][i - 1]][D - d - 1]; } for (int i = 0; i < deg; i++) { dp[u][d] = max(dp[u][d], pref[i] + suff[i + 1] + dp[G[u][i]][d - 1]); } } else { for (int v : G[u]) { dp[u][d] += dp[v][d - 1]; } } } for (int d = N; d > 0; d--) { dp[u][d - 1] = max(dp[u][d - 1], dp[u][d]); } } int main() { cin >> N >> D; D = min(D, N); for (int i = 1; i < N; i++) { int p; cin >> p; G[p].push_back(i); } DFS(0); cout << dp[0][0] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...