本文轉自:http://blog.csdn.net/angon823/article/details/52334548
介紹
1、什么是樹型動態規划
顧名思義,樹型動態規划就是在“樹”的數據結構上的動態規划,平時作的動態規划都是線性的或者是建立在圖上的,線性的動態規划有二種方向既向前和向后,相應的線性的動態規划有二種方法既順推與逆推,而樹型動態規划是建立在樹上的,所以也相應的有二個方向:
1、葉->根:在回溯的時候從葉子節點往上更新信息
2、根 - >葉:往往是在從葉往根dfs一遍之后(相當於預處理),再重新往下獲取最后的答案。
不管是 從葉->根 還是 從 根 - >葉,兩者都是根據需要采用,沒有好壞高低之分。
2、樹形動態規划的優美之處
3、難點
4、補充
正文
1、入門題
2、一般
3、難
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)
