这几天想突破一下树形DP,这也是高中时候一直没能搞定的。
今天先来两道简单的水一下。
HDU2196 Computer 给一棵树,求树中每个点离其他点最远的距离。每个点第一遍DFS记录能达到的最远距离dp1[]和次远距离dp2[],之后第二遍dfs,每次先更新当前节点答案然后再向下搜。如果当前节点位于父节点答案所在链上,即dp1[j]+w[i,j]=dp1[i],此时又分两种情况1: dp1[j]<dp2[i]+w[i,j],则dp2[j]=dp1[j],dp1[j]=dp2[i]+w[i,j],2:dp1[j]>=dp2[i]+w[i,j],则dp1[j]不变,dp2[j]=max(dp2[j],dp2[i]+w[i,j]) 剩余情况就是当前节点不在父节点答案所在链上,这时dp2[j]=max(dp1[j],dp2[i]+w[i,j]),dp1[j] = dp1[i]=w[i,j]。注意两个数组的赋值。
POJ2378 Tree Cutting 给一棵树,求出树中所有满足条件的点:将这个点除去,剩余所有联通块大小不超过总结点数的一半。第一次dfs统计子树大小,第二次dfs时,若子树小于一半节点,直接返回,遍历所有子节点,记一个flag,子树中如果出现大于总结点一半的,flag=false,并且搜索该子树,碰到等于一半的可以直接记录答案。最后搜索完所有的子节点,如果flag=true,将本节点计入答案。
永远忘不了被一道各位大佬称之为“简单树形DP”的JLOI2016侦察守卫虐到怀疑人生
原文地址:https://www.cnblogs.com/hzs2000/p/9899116.html
时间: 2024-10-09 09:41:11