树形DP总结

来源:互联网 发布:软件系统调试 编辑:程序博客网 时间:2024/05/16 10:49
  • 状态转移方程:

题型一

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,表示子节点含有这些子节点时候需要删除的最少边数。

0 0
原创粉丝点击