C++ 树形DP经典例题详解——二叉苹果树
引言
这是十分经典的树形DP题,其转移方程很好想到,但有一些坑要注意
题目描述
有一棵苹果树,如果树枝有分叉,一定是分 2 叉(就是说没有只有 1 个儿子的结点)。这棵树共有 N 个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是 1。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有 4 个树枝的树: 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。 给定需要保留的树枝数量,求出最多能留住多少苹果。
输入
第1行: 2个空格分开的整数,N 和 Q(1≤Q≤N,1<N≤100),N表示树的结点数,Q表示要保留的树枝数量。 接下来 N-1 行描述树枝的信息。 每行3 个整数,前两个是它连接的结点的编号。第3 个数是这根树枝上苹果的数量。 每根树枝上的苹果不超过30000 个。
输出
第1行:一个整数,表示最多能留住的苹果的数量。
样例输入
Copy (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
5 2 1 3 1 1 4 10 2 3 20 3 5 20样例输出
21
思路
对于这一题,可以很快想到动态转移方程
dp[ i ][ j ] = max ( dp[ i ][ j ] , dp[ i ]