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∈S?dp[v]???(used[u]=true)???????∑v∈S?dp[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列