int n, m; int val[N]; int dp[N][N][N]; vector<int> g[N]; voiddfs(int u){ for (auto v:g[u]){ dfs(v); } dp[u][1][0] = 0; dp[u][1][1] = val[u]; for (int i = 2; i<=g[u].size()+1;i++){ int v = g[u][i-2]; for (int j = 0; j<=n; j++){ for (int k = 0; k<j;k++){ dp[u][i][j] = max(dp[u][i][j], dp[v][g[v].size()+1][k]+dp[u][i-1][j-k]); } } } } voidsolve(){ cin >> n >>m; for (int i = 1; i<=n; i++){ int u; cin >> u >> val[i]; g[u].push_back(i);
int n, m; int val[N]; int dp[N][N][N]; int cnt[N]; vector<int> g[N]; voiddfs(int u){ cnt[u] = 1; dp[u][1][0] = 0; dp[u][1][1] = val[u]; for (int i = 2; i<=g[u].size()+1;i++){ int v = g[u][i-2]; dfs(v); cnt[u] +=cnt[v]; // 记录子树大小 for (int j = 0; j<=cnt[u]; j++){ for (int k = 0; k<min(cnt[v]+1,j);k++){ // k不超过子节点子树大小 dp[u][i][j] = max(dp[u][i][j], dp[v][g[v].size()+1][k]+dp[u][i-1][j-k]); } } } } voidsolve(){ cin >> n >>m; for (int i = 1; i<=n; i++){ int u; cin >> u >> val[i]; g[u].push_back(i);
int n, m; int val[N]; int dp[N][N]; int cnt[N]; vector<int> g[N]; voiddfs(int u){ cnt[u] = 1; dp[u][0] = 0; dp[u][1] = val[u]; for (int i = 1; i<g[u].size()+1;i++){ int v = g[u][i-1]; dfs(v); for (int j = cnt[u]; j>=0; j--){ for (int k = cnt[v]; k>=0;k--){ if(k==0||j>0) dp[u][j+k] = max(dp[u][j+k], dp[v][k]+dp[u][j]); } } cnt[u] +=cnt[v]; } } voidsolve(){ cin >> n >>m; for (int i = 1; i<=n; i++){ int u; cin >> u >> val[i]; g[u].push_back(i); } dfs(0); cout << dp[0][m+1]; }
int n, m; int val[N]; int dp[N][N]; int cnt[N]; int num[N]; int tot = 0; vector<int> g[N]; voiddfs(int u){ cnt[u] = 1; for(auto v: g[u]){ dfs(v); cnt[u]+=cnt[v]; } num[++tot] = u; } voidsolve(){ cin >> n >>m; for (int i = 1; i<=n; i++){ int u; cin >> u >> val[i]; g[u].push_back(i); } dfs(0); for (int i = 1; i<=n; i++){ for (int j = 0; j<=m; j++){ if(j>0) dp[i][j] = max(dp[i-1][j-1]+val[num[i]], dp[i-cnt[num[i]]][j]); } } cout << dp[n][m]; }