樹形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。現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快...