51Nod 1322 - 关于树的函数(树DP)
【题目描述】
【思路】
看了大佬的题解才想明白的,f_zyj大佬的题解
两棵树,对第一棵树暴力枚举所有边,拆掉这条边后的两个子树对应两个集合 A1,B1A1,B1A1,B1,用 dfsdfsdfs 枚举,然后在枚举出某一个 A1,A2A1,A2A1,A2 时,所有在 A1A1A1 中的节点 uuu,used[u]=trueused[u]=trueused[u]=true,现在对第二棵树枚举,dfs2dfs2dfs2 枚举的时候和刚才 dfs1dfs1dfs1 不同,这回是把节点 uuu 和 uuu 的所有子孙看成集合 B1B1B1,树上的其它节点看成是集合 B2B2B2,这样一来,可以递推的计算集合中元素的个数已经 A1,B1A1,B1A1,B1 交集的大小,设第二棵树上节点 uuu 对应的集合大小为 num[u]num[u]num[u],和 A1A1A1 的交集大小为 dp[u]dp[u]dp[u],如果 uuu 的所有儿子节点所在集合为 SSS ,那么就有 num[u]=1+∑v∈Snum[v]num[u]=1+\sum_{v \in S}num[v]num[u]=1+v∈S∑num[v] dp[u]={1+∑v∈Sdp[v] (used[u]=true) ∑v∈Sdp[v] (used[u]=false) dp[u]=\begin{cases} 1+\sum_{v \in S}dp[v] \ \ \ (used[u]=true) \\ \ \ \ \ \ \ \ \sum_{v \in S}dp[v] \ \ \ (used[u]=false) \end{cases} dp[u]={1+∑v∈Sdp[v] (used[u]=true) ∑v∈Sdp[v] (used[u]=false)
而且只要知道 A1,B1A1,B1A1,B1 的交集大小,并且 A1,A2A1,A2A1,A2交集为空,B1,B2B1,B2B1,B2交集为空,因此其余三对集合的交集大小也能推算出来,取一下最大值,不过题解里的“树归”是个啥?树上递归吗?不是很懂…
转载于:https://www.cnblogs.com/wafish/p/10465115.html
总结
以上是生活随笔为你收集整理的51Nod 1322 - 关于树的函数(树DP)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 设置storage模块的数据库操作支持、
- 下一篇: 编写代码约定,每行字符长度不超过80列