二叉苹果树--树上动态规划

#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define maxn 200
using namespace std;
int val[maxn];
struct Node {
int p;
int len;
Node(int a, int b) :p(a), len(b) {}
};
vector<Node>G[maxn];
void insert(int be, int en,int len) {
G[be].push_back(Node(en, len));
}
int n, m;
int l[maxn], r[maxn];
int dfs1(int x,int fa) {//建立树
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i].p;
if (p == fa) continue;
val[p] = G[x][i].len;
if (!l[x]) l[x] = p;
else r[x] = p;
dfs1(p, x);
}
return 0;
}
int dp[maxn][maxn];
int dfs(int i, int j) {//编号i,有j个树枝
if (j == 0) return 0;
if (l[i] == 0 && r[i] == 0) return val[i];
if (dp[i][j] > 0) return dp[i][j];
for (int k = 0; k < j; k++) {
dp[i][j] = max(dp[i][j], dfs(l[i], k) + dfs(r[i], j - k - 1) + val[i]);
}
return dp[i][j];
}
int main() {
memset(dp, -1, sizeof(dp));
int be, en, len;
scanf("%d %d", &n, &m);
m++;
for (int i = 0; i < n-1; i++) {
scanf("%d %d %d", &be, &en, &len);
insert(be, en, len);
insert(en, be, len);
}
dfs1(1, -1);
int chal = dfs(1, m);
cout << chal << endl;
return 0;
}
寻找真正的热爱

浙公网安备 33010602011771号