樹,一種十分優美的資料結構,因為它本身就具有的遞迴性,所以它和子樹見能相互傳遞很多資訊,還因為它作為被限制的圖在上面可進行的操作更多,所以各種用於不同地方的樹都出現了,二叉樹、三叉樹、靜態搜尋樹、AVL樹,線段樹、SPLAY樹,尾碼樹等等..
枚舉那麼多種資料結構只是想說樹方面的內容相當多,本專輯只針對在樹上的動態規劃,即樹形DP.做樹形DP一般步驟是先將樹轉換為有根樹,然後在樹上進行深搜操作,從子節點或子樹中返回資訊層層往上更新至根節點。這裡面的關鍵就是返回的資訊部分,這個也沒一般性的東西可講,因為每道題目要求做的事都不盡相同。
這個專輯暫時氛圍3哥部分,分的可能不是很好,後面題目做多了理解更深了可能會更改,但那都是後話了。
一、常規樹形DP
1、 Hdu 1520 Anniversary party
每個節點有權值,子節點和父節點不能同時選,問最後能選的最大價值是多少?解題報告Here 2、Hdu
2196 Computer 經典題,求樹每個點到其他點的最遠距離,轉化為有根樹,深搜兩次,一次記錄到葉子的最遠距離,一次更新最終答案。解題報告Here 3、Poj 1741 Tree(難) 經典題,求樹上兩點間距離小等於K的方案數,樹上分治。解題報告Here 4、Poj 2152 Fire(難) 罕見的O(n^2)的樹形DP,在樹上建消防站,要求每個節點離最近的消防站距離小於K,問最小花費。解題報告Here 5、Poj 3162 Walking Race(難) 樹形DP找最遠距離+線段樹查詢最大最小值,然後再維護兩個指標遍曆整個序列。解題報告Here 6、cf 218D. Choosing Capital for Treeland 把邊方向轉變成邊權,正向為0,反向為1.經過轉換,問題變成求某點為根到所有點的邊權總和,求邊權總和最小的那些點。二、樹形背包問題(在樹上進行分組背包處理)
1、Poj 1155 TELE 把每個節點的子節點看成一組背包,最大容量是這點的葉子子孫數量,選幾個節點就是選擇的容量,價值就是使用者給的Money-中轉費用。解題報告Here 2、Hdu 1011 Starship
Troopers 和上題相似,要選擇父節點必先子節點,特判m為0的時候。 3、Poj 1947 Rebuilding Roads 求最少刪除幾條邊使得子樹節點個數為p,具體的模型和上題很像。解題報告Here 4、Hdu 1561 The more, The Better 在一棵樹上選擇若干個點獲得的最大價值,選子節點必須先選父節點,求解情況和上兩題相同。解題報告Here 5、Hdu 4003 Find Metal Mineral (推薦,好題) 樹形DP+選且只能選一個物品的分組背包,狀態轉移方程難想。解題報告here 6、Poj 2486 Apple Tree 樹形DP+分組背包,但是狀態轉移方程要分三步,較為難想。解題報告Here 7、Poj 3345 Bribing FIPA 樹形DP+分組背包,和前面幾題相比沒有特殊的地方,只是要注意輸入。具體可見Here 8、Hdu 4044 GeoDefense 樹形DP+分組背包,要求從每個兒子結點擷取最小的hp,然後找這些兒子的最大組合,不是特別好想。解題報告見Here 9、Zoj 3627 Treasure Hunt II 樹形DP +分組背包,浙大月賽的水題,很普通的樹形背包。 10、4276 The Ghost Blows Light 有兩種寫法,一種是把一棵樹壓縮成一條鏈,然後在鏈上DP,一種和 Apple tree差不多,具體見Here三、刪點或者刪邊類樹形DP
1、Hdu 3586 Information Disturbing 二分Upper power limit,然後從葉子節點向上更新,邊權與limit比較再進行狀態轉移。解題報告Here 2、Poj 3107 Godfather 刪點,使剩下的分支中最大的節點數最小,深搜一次記錄到葉子節點距離,再進行枚舉求最大值,再更新答案。解題報告Here 3、Poj 2378 Tree Cutting 刪點,使剩下的分支中有最大節點數的分支小等於總數一半,問有幾種方案,和上題差不多。解題報告Here
4、Poj 1655 Balancing Act 刪點,使剩下的分支中最大的節點數最小,深搜一次記錄到葉子節點距離,再進行枚舉求最大值,再更新答案。解題報告Here 5、Poj 3140 Contestants Division 刪邊,求刪去某條邊後兩個分支的最小差異值,也是深搜兩次。解題報告Here
這篇文章將會不斷更新,以後每遇到樹形DP我都會整理進這個專題,希望大家保持關注。 本文ZeroClock原創,但可以轉載,因為我們是兄弟。