呃待更……
树形dp
问题:给一颗树,要求一最少的代价(或最大收益)完成给定的操作
和常见的dp问题一样,树形dp解决也要考虑三步
1、确立状态
2、状态转移
3、实现方式:一般是记忆化(树形dp中)
1、由根分成左子树和右子树的情况(二叉树)
例题#2530
有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)。这棵树共有N个结点(叶子点或者树枝分叉点),编号为1–N,树根编号一定是1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树
2 5
\ /
3 4
\ /
1
现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。
给定需要保留的树枝数量,求出最多能留住多少苹果。
输入
第1行2个数,N和Q(1 <= Q <= N,1 < N <= 100)。
N表示树的结点数,Q表示要保留的树枝数量。接下来N-1行描述树枝的信息。
每行3个整数,前两个是它连接的结点的编号。第3个数是这根树枝上苹果的数量。
每根树枝上的苹果不超过30000个。
输出
一个数,最多能留住的苹果的数量。
样例输入
5 2
1 3 1
1 4 10
2 3 20
3 5 20
样例输出
21
分析:
本题权值在边上;不好思考
把边的权值转移到点上性质不变
设f(i,j)表示一i为根的子树上保留j个节点时最多可以保留的苹果数量
设ch[i,0],ch[j,1]分别为i节点的左右儿子
状态转移方程
f[i,j]=max{f[ch[i,0],k]+f[ch[i,1],j-k-1]+a[i]}
(0<=k<=j-1)
代码略(待填充)