AAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCCCCCCCCCCCCCCCC

许诺  •  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;

}


评论:

请先登录,才能进行评论