답안 #798281

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
798281 2023-07-30T14:45:31 Z tch1cherin Cat in a tree (BOI17_catinatree) C++17
0 / 100
1 ms 340 KB
#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);
  if (D == 1) {
    cout << N << "\n";
    exit(0);
  }
  cout << dp[0][0] << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -