树形dp(待填充)

呃待更……

树形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)
代码略(待填充)

你可能感兴趣的:(dp,树形dp,dp,树形dp,动态规划)