P2015 二叉苹果树

传送门

一道树形dp入门题,先放代码后面补。

#include <bits/stdc++.h>
using namespace std;

const int N = 210;
int head[N], tot, dp[N][N];
struct Edge{
	int v, w, next;
}edge[N];
int n, q;
void add(int u, int v, int w){
	edge[tot].v = v;
	edge[tot].w = w;
	edge[tot].next = head[u];
	head[u] = tot ++;
}

void dfs(int now, int pre){
	for(int i = head[now]; i != -1; i = edge[i].next){
		int v = edge[i].v;
		if(v == pre)
			continue;
		dfs(v, now);
		for(int j = q; j >= 0; j --)
			for(int k = 0; k < j; k ++)
				dp[now][j] = max(dp[now][j], dp[now][k] + dp[v][j - k - 1] + edge[i].w);
	}
}

int main(){
	cin >> n >> q;
	memset(head, -1, sizeof head);
	for(int i = 1; i <= n - 1; i ++){
		int u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
		add(v, u, w);
	}
	dfs(1, 0);
	cout << dp[1][q] << endl;
	
	return 0;
}
上一篇:没有上司的舞会(经典树形dp)


下一篇:【网络流】P1791 [国家集训队]人员雇佣