树形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,表示子节点含有这些子节点时候需要删除的最少边数。
- 树形dp+树形结构总结
- 树形DP总结
- 树形dp总结
- 树形DP总结
- 树形DP总结
- 树形dp简单总结
- 树形DP入门总结
- 树形dp 总结
- 树形dp总结
- 树形DP总结
- 树形DP总结
- 树形dp总结
- 树形 DP 总结
- 树形dp总结
- 树形DP 总结
- 树形dp总结
- 【DP】树形DP题目总结
- 树形DP总结(转)
- 断点不能使用解决办法
- Java学习-循环(while&do-while)
- java 没有printIn
- LeetCode - 284. Peeking Iterator
- 下面重载乘法运算符的函数原型声明中正确的是:
- 树形DP总结
- hdoj-2092-整数解
- HDD is Outdated Technology
- ART世界探险(2) - 从java byte code说起
- 服务器后台开发中的一点经验
- 指针的指针的理解以及应用
- linux 信号的使用
- mq基础知识
- Java学习-循环(for)