樹形 DP 總結


本文轉自:http://blog.csdn.net/angon823/article/details/52334548

介紹

1、什么是樹型動態規划 

顧名思義,樹型動態規划就是在“樹”的數據結構上的動態規划,平時作的動態規划都是線性的或者是建立在圖上的,線性的動態規划有二種方向既向前和向后,相應的線性的動態規划有二種方法既順推與逆推,而樹型動態規划是建立在樹上的,所以也相應的有二個方向: 

    1、葉->根:在回溯的時候從葉子節點往上更新信息

    2、根 - >葉:往往是在從葉往根dfs一遍之后(相當於預處理),再重新往下獲取最后的答案。

    不管是 從葉->根 還是 從 根 - >葉,兩者都是根據需要采用,沒有好壞高低之分。

2、樹形動態規划的優美之處

樹真的是一種特別特別優美的結構!用來做動態規划也簡直是錦上添花再美不過的事,因為樹本身至少就有“子結構”性質(樹和子樹);也本身就具有遞歸性。所以在樹上DP其實是其所當然的事,相比線性動態規划來講,轉移方程更直觀,更易理解。

3、難點

   1、和線性動態規划相比,樹形DP往往是要利用遞歸的,所以對遞歸不熟悉的同學,是一道小小的障礙,說是小小的,因為要去理解也不難。
   2、細節多,較為復雜的樹形DP,從子樹,從父親,從兄弟……已經一些小的要處理的地方,腦子不清晰的時候做起來頗為惡心
   3、狀態表示和轉移方程,也是真正難的地方。做到后面,樹形DP的老套路都也就那么多,難的還是怎么能想出轉移方程,狀壓DP、概率DP這些特別的DP應該說做到最后都是這樣!

4、補充

   建有向圖還是無向圖? 一般來說我們做樹DP都是從上往下遞歸,如果不亂搞是不會從子節點往根節點的遍歷的,這時候可以建有向圖,只加邊一次就可以,對於有“思想潔癖”的人來說,如果加一次邊就可以再讓他加兩次是很難受的。但是有些題目可能很隱蔽的某個地方涉及到從子節點往上訪問,就會錯的很慘。所以,一般不非常確定建有向圖就可的話還是建無向圖吧。

正文

暫時分入門,一般、難三個等級,而不分類別。以后做的題目多了再改。

1、入門題

1、 HDU 1520 Anniversary party 子節點和父親節點不能同時選,問最大價值。 題解
2、 HDU 2196 Computer 求樹上每個點能到達的最遠距離   題解

2、一般

1、 D. Choosing Capital for Treeland 給一個n節點的有向無環圖,要找一個這樣的點:該點到其它n-1要逆轉的道路最少,(邊<u,v>,如果v要到u去,則要逆轉該邊方向) 題解
2、 Godfather  求樹的重心(刪除該點后子樹最大的最小) 題解
3、 POJ 3107 Tree Cutting  求刪除哪點后子樹最的小於等於節點總數的一半  題解
4、 POJ 3140 Contestants Division 刪除某邊后剩余兩個分支差值最小是多少  題解

3、難

1、 HDU 3586 Information Disturbing 給定一個帶權無向樹,要切斷所有葉子節點和1號節點(總根)的聯系,每次切斷邊的費用不能超過上限limit,問在保證總費用<=m下的最小的limit。 題解
2、 POJ 3162 Walking Race  一棵n個節點的樹。wc愛跑步,跑n天,第i天從第i個節點開始跑步,每次跑到距第i個節點最遠的那個節點(產生了n個距離),現在要在這n個距離里取連續的若干天,使得這些天里最大距離和最小距離的差小於M,問怎么取使得天數最多? 題解
3、 HDU 5834 Magic boy Bi Luo with his excited tree 每個節點有一個價值Vi,每走一次一條邊要花費Ci,問從各個節點出發最多能收獲多少價值  題解
4、 POJ 2152 Fire n個節點組成的樹,要在樹一些點上建立消防站,每個點建站都有個cost[i],每個點如果不在當前的點上建站,也要依賴其他的消防站,並且距離不超過limit[i]。求符合上述條件的最小費用建站方案  題解
5、 POJ 1741 Tree 求樹上距離小於等於K的點對有多少個  題解
 
 
列出一些經典問題吧:

1:給出一棵樹 每個節點有權值  要求父節點和子節點不能同時取 求能夠取得的最大值  (hdu1520)

2:給出一棵樹,求離每個節點最遠的點的距離 (hdu2196)

3:1>在一個地圖上,有N座城堡,每座城堡都有一定的寶物,在每次游戲中允許攻克M個城堡並獲得里面的寶物。但由於         地理位置原因,有些城堡不能直接攻克,要攻克這些城堡必須先攻克其他某一個特定的城堡。求獲得盡量多的寶物應         該攻克哪M個城堡。 (hdu1561)

題解:樹形dp+背包 

     2>每個節點有兩個值bug和brain,當清掃該節點的所有bug時就得到brain值,只有當父節點被清空時,才可以清掃它          的子節點,而清掃需要一定的人員。給定M個人員,N個結點的樹,求最大brain和 (hdu1011)

     3>現在有n個村子,你想要用收買m個村子為你投票,其中收買第i個村子的代價是val[i]。但是有些村子存在從屬關                系,如果B從屬於A國,則收買了A也意味着買通了B,而且這些關系是傳遞的。問你最小要付出的代價是多                        少? (poj3345)

4:1>一棵樹,定義每個節點的balance值:去掉這點節點后的森林里所有樹的最大節點數。求出最小的balance值和其所           對應的節點編號(poj1655)

     2>給你一棵無向樹 T,要求依次去除樹中的某個結點,求去掉該結點后變成的森林 T' 中的最大分支。並要求該分支為            去除的結點盡可能少。答案可能有多個,需要按照節點編號從小到大輸出 (poj3107)

5:給一棵樹, n結點<=1000, 和K< =200,  在這棵樹上找大小為k的子樹, 使其點權和值最大 (zoj3201)

6:給一個樹狀圖,有n個點。求出,去掉哪個點,使得剩下的每個連通子圖中點的數量不超過n/2。如果有很多這樣的            點,就按升序輸出。n<=10000 (poj2378)

7:一棵n個結點的帶權無根樹,從中刪去一條邊,使得剩下來的兩棵子樹的節點權值之和的絕對值最小,並求出得到的最     小絕對值 (poj3140)

8:給出一些點,有值,給出一些邊,然后求去掉一條邊后將分成連通的兩部分,且兩部分的差值最小 (hdu2242)

9:有n個點組成一個樹,問至少要刪除多少條邊才能獲得一棵有p個結點的子樹 (poj1947)

10:一棵樹n<=1000(節點的分支<=8),Snail在根處,它要找到在某個葉子處的house而其中一些節點上有worm,worm        會告訴它的house是否在這個子樹上求Snail最快尋找到house走過路徑的期望值 (poj2057)

11:給你一顆蘋果樹,有N個節點每個節點上都有一個蘋果也就是有一個權值,當你經過這個節點是你將得到這個權值,         重復走節點是只能算一次,給你N-1條邊。問你只能走K步能得到的最大權值和 (poj2486)

12:一顆二叉蘋果樹樹上結蘋果,要求剪掉幾棵枝,然后求保留Q根樹枝能保留的最多到蘋果數 (ural1018)

13:給定一棵樹,求最少連多少條邊,使得每個點在且僅在某一個環內。 (poj1848)

14:在一棵樹形的城市中建立一些消防站,但每個城市有一個最大距離限制,求需要的最小花費 (poj2152)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM