樹形DP初探 總結

2022-03-17 17:06:41 字數 3928 閱讀 4447

這幾天,我自學了基礎的樹形dp,在此給大家分享一下我的心得。

首先,樹形dp這種題主要就是解決有明確分層次且無環的樹上動態規劃的題。這種題型一般(注意只是基礎、普通的情況下)用深度優先搜尋來解決實際的dp部分,而且一般用記憶化搜尋,因為樹會有重複遍歷節點的情況。在一棵樹上針對普遍子樹都滿足根節點與兩個子節點有特殊關係的,樹形dp就應該是解決這道題的優選方法了。

講完基礎的定義,我們來講幾個挺有用的性質:

1、在一棵二叉樹上,已知其中序遍歷,它的任乙個節點都可以成為它的根節點,對於每乙個子樹都成立。

2、在二叉樹上任乙個節點出發,都能遍歷每乙個位置。而且每個節點與另乙個節點只有一條枝條連通。

3、樹中一定無環。

4、多叉樹轉變成的二叉樹中,原來的兄弟節點的兄弟還是自己的兄弟,孩子的孩子也還是自己的孩子的孩子,但是兄弟的孩子與自己無關,而且兄弟和自己是具有同等發展機會的。

5、樹是具有遞迴性質的,無論是建樹還是遍歷,遞迴都有效。

6、……

接下來,這個儲存樹的方式也很講技巧。判斷節點數多不多,很少的話建議用鄰接矩陣。

假如邊數太多的話而且邊與邊之間聯絡比較大的話,建議用鄰接表(鏈式前向星,資料大小要開2*n)。或者還可以用專門存樹的各種方法,例如樹根孩子表示法,雙親表示法,孩子兄弟表示法(重點)……

最後講講做這種題的步驟:

1、讀題,分析。判斷這道題到底是不是樹形dp,還是披著樹的外套的普通區間dp,還是其他樹的問題。假如不是,馬上找其他的方法。

2、想想怎麼建樹。首先該用什麼來儲存,判斷這是一棵怎樣的樹。是單純二叉樹呢,或者單純多叉樹,還是多叉樹轉二叉樹呢,這都需要經驗判斷,不同的題不一樣。建樹的過程可以用乙個dfs(普通二叉樹),也可以用建圖的方法(多叉樹),還可以用brother和child的方法(多叉轉二叉)。

3、列出狀態轉移方程,並且用記憶化搜尋來實現。選擇返不返回值的時候因情況而定。

4、檢查邊界情況和初始化夠不夠周全,通常會在這裡失分。還要想想有沒有必要優化和有沒有優化的方法,例如用指標儲存等等。

講幾道例題:

1、加分二叉樹

這道題分析後發現它並不是樹形dp,只是有樹的外形的區間dp,所以不滿足第一步判斷,撤。不過他的輸出先序遍歷還是挺值得理解一下的。

詳情請看:

2、二叉蘋果樹

這道題是最基礎的二叉樹版樹形dp。他用樹根孩子表示法,很簡單解決。

注意建樹的時候記得刪邊,而且最後輸出的是q+1。

詳情請看:

3、最大利潤

這道題是我們學校初三的一位大佬推薦的,儘管我們並沒有做過(是jzoj的題),但是也是多叉樹中的一道好題。注意是雙向邊。有興趣的同學可以去搜一下。

4、沒有上司的舞會

這道題也是多叉樹的一道經典題目,經過無數次改編。要用鄰接表來儲存。但是要注意初始化的時候小心點。後面用取點還是不取點的方法取到最大值。

詳情請看:

5、選課

這道題是一道多叉樹轉二叉樹的經典題。要用孩子兄弟表示法來儲存。是一道有依賴性的問題。我比較看好他的改編版,要是我們要輸出取了那些課程,那麼這道題就變難了許多。我們可以通過原路返回的思想,一路找回相等的數值,那麼就可以推出答案。同時也可以邊記憶化搜尋邊推答案。

詳情請看:

6、軟體安裝

這道題是選課的乙個公升級版,假如大家對選課非常熟悉和理解透徹的話,相信理解起來不是問題。但是初始化有點麻煩。

因為題目的意思是可能會出現互相依賴的情況,所以這道題是有環的。所以我們就要加入判環和縮點兩個步驟。把判出來的環縮成乙個新點。之後就和選課別無他樣了。

詳情請看:

說了這麼多,總結一下。

這只是基礎的樹形dp,往下學肯定有各種的優化,本人在此先不作講解,水平有限,見諒。

要是算過記憶體或者陣列會爆的話,可以用鍊錶、指標來優化一下儲存的環節。

記憶化搜尋部分一定要注意邊界條件,否則會出錯。

最後,講乙個自己總結的樹形dp的套路。要是我們判斷了一道題是樹形dp,那麼一般只可能3種儲存:鄰接矩陣、鄰接表、孩子兄弟。然後記憶化部分就是簡單的判斷有無出現過,到邊界了沒有,假如都不滿足,就搜尋下一層,通過不斷減少體積(分體積)的方法求出最值。(普通dp的基本操作)

請各位大神指正,謝謝大家!

樹形dp總結

from 列出一些經典問題吧 1 給出一棵樹 每個節點有權值 要求父節點和子節點不能同時取 求能夠取得的最大值 hdu1520 2 給出一棵樹,求離每個節點最遠的點的距離 hdu2196 3 1 在乙個地圖上,有n座城堡,每座城堡都有一定的寶物,在每次遊戲中允許攻克m個城堡並獲得裡面的寶物。但由於地...

樹形dp總結

這個月一直搞dp了,狀壓,數字,樹形,感覺雖然有時訓練很辛苦,但真的很充實。這個星期看了一些樹形dp的資料。樹形dp簡單來說就是在樹上的dp,這裡的很多題,都和揹包有聯絡,從乙個根節點開始,分配方案給它的子樹。有乙個很有意思的題。沒有上司的聚會 hdu 1520 大致題意就是說,要舉辦乙個聚會,每個...

樹形DP總結

換根 fat結點更新u結點子結點 dp fat ans fat max dp u 0 老方法 更新根節點 ans u dp u max dp fat 0 第一次dfs 回溯時處理子結點為u向下的簡單路徑第一大和第二大 第二次dfs 遞迴處理子結點為u向上的簡單路徑最大 const int n 5e5...