树形DP总结

  • 状态转移方程:

题型一

Q:给出一颗树,每个节点有其价值,如果父节点在,子节点就不能存在,然后求选哪些点能得到最大价值。

A:从问题入手:求最大价值,所以dp数组存储价值,状态为该节点选或不选,所以j表示这个状态,i表示当前节点,所以得出dp[i][j] 表示第i个节点,状态为j (0:不选,1:选)的情况下的价值。因为该问题可以不断由其子问题推出:
所以推导除出状态转移方程:

dp[i][0] = max ( dp[i-1][1], dp[i-1][0] )
dp[i][1] = dp[i-1][0]

题型二

Q:给出一颗树,每个节点都有其价值,如果想选某一节点,则必须先选择其父节点,然后求怎么选则能得到最大价值。

A:从问题入手:求最大价值,所以dp数组存储价值,状态为该节点选多少个子节点,所以j表示选子节点的个数,i表示当前节点,得出dp[i][j]表示以i为父节点时,选取j个节点所能得到的最大价值。因为该问题可以不断由其子问题推出:
所以推导除出状态转移方程:

dp[i][j] = max ( dp[i][j], dp[son][k]+dp[i][j-k] )

其中son为i的子节点,k的数量小于j。以此类推dp[son][k]即可。

题型三:

Q:给出一颗树,问为得到含有P个节点的子树,最少需要删除多少条边。

A:从问题入手:求最少删除的边数,所以dp数组存储边数,状态为该节点含有多少个节点的子树,所以j表示该节点含有子节点数目,i表示当前节点,得出dp[i][j]表示以i为父节点时,含有j个节点所需要删除的最少边数,因为该问题可以不断由其子问题推出:
所以推导除出状态转移方程:

dp[i][j] = min( dp[i][j]+1, dp[son][k]+dp[i][j-k])

其中son为i的子节点。搜索的时候先遍历i的所有子节点,然后再遍历p~1,表示子节点含有这些子节点时候需要删除的最少边数。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值