[Non]二叉苹果树
[Non]二叉苹果树
大意
给定需要保留的树枝数量,求出最多能留住多少苹
果。苹果长在树枝上。
思路
这个题目和选课最大的不同在于其需要累加的贡献在边上,因此我们依旧设 \(f_{u, j}\),则有转移方程如下:
\[f_{u, j} = \max(f_{u, j}, f_{u, j - k - 1} + f_{v, k} + w)
\]
\(j - k - 1\) 的原因在于需要 \(1\) 的贡献来记 \(E \langle u, v \rangle\) 这条边,然后就没了。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
struct node {
int v, w;
};
vector<node> g[N];
int f[N][N], n, q, a[N];
void dfs(int u, int fa) {
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].v, w = g[u][i].w;
if (v != fa) {
dfs(v, u);
for(int j = q;j > 0;j --){
for(int k = 0;k < j;k ++){
f[u][j] = max(f[u][j], f[v][k] + w + f[u][j - k - 1]);
}
}
}
}
}
int main() {
cin >> n >> q;
for (int i = 1; i < n; i++) {
int x, y, z;
cin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
dfs(1, -1);
cout << f[1][q];
return 0;
}
本文来自一名高中生,作者:To_Carpe_Diem

浙公网安备 33010602011771号