樹形dp專題

2021-07-31 16:53:44 字數 1239 閱讀 4262

1.cf 804 c

最大團染色+dfs

題目中有個條件,相同的冰淇淋所在的節點是連通的,這個很重要

那麼我們就對這個樹t進行dfs,同時給g染色就行了

最大團染色xjb寫 **

2.xidian 1070

樹形dp

dp[i][j]表示以i為根選j個節點的最大值

注意:類似於01揹包那樣逆推,就不會重複選擇相同的子樹了 **

3.atcoder grand contest 012 b

樹形dp

1)暴力dfs

儲存每乙個頂點連同的頂點。

每一次輸入v,d,c,搜尋v節點的d範圍內能夠染色的點,每一次d-1;

然後你會發現完美的超時了

2)dp

dp[i][d]表示當前i節點d距離時的顏色,所以dp[i][0]為i節點的顏色,

所以就可以在dfs時判斷如果當前節點dp[i][d]已經染了色,就可以不用染色了。

還有的就是:因為顏色是覆蓋的,所以最後染的顏色就是結束的顏色。所以我們應該從後往前開始染色。

這樣就可以保證,如果這節點d[i][0]染了色,就不會被覆蓋了。

複雜度o(n*d) **

3)優化dfs

反過來做,染色過的點就不再染色

對於點u來說,如果以它為中心,距離為d的所有點都被染色過,那麼下次你要對u距離為d』 (d』<=d) 的點染色時就可以直接退出了

複雜度o(n) **

4.poj1947

題意:

給一棵樹,問最少刪掉幾條邊.使得剩下的子樹中有節點個數為p個。

思路:

正過來想刪多少邊不好想,可以反過來思考保留多少節點  

f(i, j) 表示子樹i,保留j個節點的最少刪邊次數, 注意,這裡保留的j個節點的子樹,是指根節點

為i的且有j個節點的子樹.這樣理解的話, 狀態轉移就容易想多了.

對於子樹i, 如果只保留1個節點,那麼連線它所有兒子節點的邊都要刪掉,

所以可以初始化 f(i, 1) = 節點i的兒子個數

f(i, j), 即子樹i保留j個節點, 那麼對於i的每個子樹,可以選擇保留1,2,..j-1個節點

那麼每個子樹可以看作是一組物品,對所有子樹做分組揹包

子樹v選擇保留k個點的話,那麼子樹i就要保留j-k個點.

所以由狀態轉移:

f(i, j) = max

最終ans = min

**

樹形dp專題

推薦乙個博主寫的 關於樹形dp中求最小支配集,覆蓋集,獨立集的部落格 他寫的關於樹形dp 的解釋很好懂 雖然還有求重心,樹形揹包什麼的沒講,不過對於我這樣剛入門的人來說應該是夠了 最小支配集 poj3659 題目含義 有1到n個點,給出點兩兩的相鄰關係,這個圖的最小支配集 題目分析 簡單易懂的最小支...

( 動態規劃專題 ) 樹形dp

動態規劃專題 樹形dp 直接看例題 p2015 二叉蘋果樹 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3...

動態規劃專題(二) 樹形DP

dp 這東西真的是博大精深啊.樹形 dp 顧名思義,就是在樹上操作的 dp 一般可以用 f i 表示以編號為 i 的節點為根的子樹中的最優解。轉移的時候一般都將資訊由子節點轉移到父親節點,也就是將資訊從下往上轉移。因此,一般樹形 dp 都會採用遞迴的形式。樹形 dp 中有一種比較經典的題型 樹上揹包...