计蒜客 课程学分总数
题目链接 课程学分总数
很基础的树型DP。注意输入数据可能是森林而不是完整的一棵树。那么给所有没有祖先的点加一个公共的根就好了。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 305; int f[N][N], sz[N], c[N]; vector <int> v[N]; int n, m; void dfs(int x){ sz[x] = 1; f[x][1] = c[x]; for (auto u : v[x]){ dfs(u); dec(i, sz[x], 1) rep(j, 1, sz[u]) f[x][i + j] = max(f[x][i + j], f[x][i] + f[u][j]); sz[x] += sz[u]; } } int main(){ scanf("%d%d", &n, &m); ++n, ++m; rep(i, 2, n){ int x, y; scanf("%d%d", &x, c + i); ++x; v[x].push_back(i); } dfs(1); printf("%d\n", f[1][m]); return 0; }