有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)
这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。
我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树
2 5 \ / 3 4 \ / 1现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。
给定需要保留的树枝数量,求出最多能留住多少苹果。
第1行2个数,NNN和Q(1<=Q<=N,1<N<=200)Q(1<=Q<= N,1<N<=200)Q(1<=Q<=N,1<N<=200)。
N表示树的结点数,Q表示要保留的树枝数量。接下来N−1N-1N−1行描述树枝的信息。
每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。
每根树枝上的苹果不超过30000个。
一个数,最多能留住的苹果的数量。
f[i][j]f[i][j]f[i][j] 表⽰以i节点为根,保留j个树枝最多留下 多少个苹果。 只给左⼉⼦:f[i][j]=f[lson[i]][j−1]+vlson[i]f[i][j]=f[lson[i]][j-1]+vlson[i]f[i][j]=f[lson[i]][j−1]+vlson[i] 只给右⼉⼦:f[i][j]=f[rson[i]][j−1]+vrson[i]f[i][j]=f[rson[i]][j-1]+vrson[i]f[i][j]=f[rson[i]][j−1]+vrson[i] 都分⼀点:f[i][j]=max(f[lson[i]][k]+f[rson[i]][j−k−2]+vlson[i],vrson[i]).0<=k<=j−2f[i][j]=max(f[lson[i]][k]+f[rson[i]][j-k-2]+vlson[i],vrson[i]). 0<=k<=j-2f[i][j]=max(f[lson[i]][k]+f[rson[i]][j−k−2]+vlson[i],vrson[i]).0<=k<=j−2.
另种思路在代码中说明
转载于:https://www.cnblogs.com/vercont/p/10210091.html
相关资源:JAVA上百实例源码以及开源项目