题解:CF1249F Maximum Weight Subset
_Ikun_xiaoheizi · · 题解
总的来说不太难,水一发。
思路
设
合并儿子
合并后最近点到
用临时数组
其中
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, k, f[205][205], a[205], d[205];
vector<int> g[205];
void merge(int u, int v) {
for (int i = 0; i <= n; i++) {
d[i] = f[u][i];
}
for (int i = 0; i <= n; i++) {
for (int j = max(0ll, k - i); j <= n; j++) {
d[min(i, j + 1)] = max(d[min(i, j + 1)], f[u][i] + f[v][j]);
}
}
for (int i = 0; i <= n; i++) {
f[u][i] = d[i];
}
return;
}
void dfs(int u, int p) {
f[u][0] = a[u];
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (v != p) {
dfs(v, u);
merge(u, v);
}
}
return;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1, x, y; i < n; i++) {
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1, 0);
int ans = 0;
for (int i = 0; i <= n; i++) {
ans = max(ans, f[1][i]);
}
cout << ans << endl;
return 0;
}
``