许诺 • 1天前
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; vector<vector> children; vector credits; vector<vector> dp; void dfs(int u, int m) {
dp[u][1] = credits[u];
for (int v : children[u]) {
dfs(v, m);
for (int k = m; k >= 1; --k) {
for (int t = 0; t <= k - 1; ++t) {
if (dp[u][k - t] != -1 && dp[v][t] != -1) {
dp[u][k] = max(dp[u][k], dp[u][k - t] + dp[v][t]);
}
}
}
}
}
int main() {
int M, N;
cin >> M >> N;
children.resize(M + 1);
credits.resize(M + 1);
for (int i = 1; i <= M; ++i) {
int pre, credit;
cin >> pre >> credit;
children[pre].push_back(i);
credits[i] = credit;
}
dp.assign(M + 1, vector<int>(N + 2, -1));
for (int i = 0; i <= M; ++i) {
dp[i][0] = 0;
}
dfs(0, N + 1);
cout << dp[0][N + 1] << endl;
return 0;
}
评论:
请先登录,才能进行评论