1. 程式人生 > >今日份水題2018.11.2

今日份水題2018.11.2

這幾天想突破一下樹形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偵察守衛虐到懷疑人生