樹形dp 沒有上司的舞會 模板題 樹形dp

2021-10-10 11:22:59 字數 2137 閱讀 2736

樹形dp思維門檻高,但是跨過門檻之後,思維難度卻不高。這點非常類似於

關鍵是要體會採用二進位制數來表示狀態的思想,要轉變傳統思維,學習接收並吸收這種思想。

285. 沒有上司的舞會

簡單模擬樣例,便於理解:

樣例的高興度都是 1,那就是挑選沒有相鄰邊的盡量多的點

樹形dp思路:

重點:狀壓dp

思路:

狀態轉移:

狀態轉移方程:f[u

][0]

=σ(f

[si]

[0],

f[si

][1]

)f[u][0]=\sigma (f[s_i][0],f[s_i][1])

f[u][0

]=σ(

f[si

​][0

],f[

si​]

[1])

、f [u

][1]

=σ(f

[si]

[0])

f[u][1]=\sigma (f[s_i][0])

f[u][1

]=σ(

f[si

​][0

])返回答案f[root][0], f[root][1]時間複雜度:一共有 2n2n

2n個狀態,每個狀態在計算過程中需要列舉它所有的兒子,則所有節點兒子的數量總和就等於樹中邊的數量,邊的數量是 n−1

n-1n−

1。則在狀態計算時,故計算所有狀態就是 o(n

)o(n)

o(n)

這個dfs(root)根節點是需要的,並不能像之前一樣,隨意找乙個點進行dfs。因為建圖的時候採用的是單向邊。

本題的物理結構相當於是一顆有根的樹,其不適用線性dp的遞推方式。而樹形dp的這種遞迴求解的方式是恰好適用本題。

動態規劃的本質是沿著乙個拓撲序來確定狀態的值的,對於乙個樹形結構而言,子節點的值遠比根節點的值好確定,那麼就是以葉子節點的值層層向上確定其父節點、根節點的值。這就是遞迴,且遵循拓撲序。所以採用dfs進行遞迴,且在回溯的時候進行狀態計算因為在回溯的時候,其子節點的狀態全部計算完畢了。

本題非常非常非常經典,是樹形dp最經典題目。

**:

#include

#include

#include

using

namespace std;

const

int n =

6005

;int n;

;int h[n]

, e[n]

, ne[n]

, idx;

int f[n][2

];bool has_father[n]

;void

add(

int a,

int b)

void

dfs(

int u)

}int

main()

int root =1;

while

(has_father[root]

) root ++

;dfs

(root)

;

cout <<

max(f[root][0

], f[root][1

])<< endl;

return0;

}

沒有上司的舞會(樹形dp入門題)

洛谷 p1352沒有上司的舞會 題目描述 某大學有 n 個職員,編號為 1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數 r i r i r i 但是呢,如果某個職員的直接上司來參加舞會了...

樹形dp 沒有上司的舞會

題意 給定一棵樹,每個點有權值,對於每乙個點,它和它的父節點不能同時被選,求權值最大值。定義d p x 0 dp x 0 表示不選擇x號點時的最大值,dp x 1 d p x 1 表示選擇 x x 號點時的最大值。對於x role presentation style position relati...

樹形DP 沒有上司的舞會

ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 hi 給出,其中 1 i n。現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快...