AcWing 285 沒有上司的舞會

2021-10-19 19:54:16 字數 2005 閱讀 9107

acwing 285. 沒有上司的舞會

ural大學有n名職員,編號為1~n。

他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。

每個職員有乙個快樂指數,用整數 hi 給出,其中 1≤i≤n。

現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。

在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快樂指數總和最大,求這個最大值。

輸入格式

第一行乙個整數n。

接下來n行,第 i 行表示 i 號職員的快樂指數hi。

接下來n-1行,每行輸入一對整數l, k,表示k是l的直接上司。

輸出格式

輸出最大的快樂指數。

資料範圍

1≤n≤6000,

−128≤hi≤127

輸入樣例:

711

1111

1132

3647

4453

5

輸出樣例:

5
樹形dp在我印象裡,應該要用遞迴實現,因為子節點需要遍歷。

所以用遞迴實現dp,我們還是閆氏分析,找狀態表示和狀態計算。

狀態表示

d p[

i][j

]dp[i][j]

dp[i][

j],j

jj為1的時候表示以i為根節點,選i。 j

jj不為1的時候表示以i為根節點,不選i

然後求的是最大值。

狀態計算

d p[

i][0

]=∑m

ax(d

p[j]

[1],

dp[j

][0]

)j是i

的子節點

dp[i][0]=∑max(dp[j][1],dp[j][0]) j 是 i 的子節點

dp[i][

0]=∑

max(

dp[j

][1]

,dp[

j][0

])j是

i的子節點dp

[i][

1]=w

[i]+

∑dp[

j][0

]j是i

的子節點

dp[i][1]=w[i]+∑dp[j][0] j是i的子節點

dp[i][

1]=w

[i]+

∑dp[

j][0

]j是i

的子節點

**如下

#include

#include

#include

using

namespace std;

const

int n=

6010

;int ne[n]

,h[n]

,e[n]

,idx;

int w[n]

;int dp[n]

[n];

bool get_father[n]

;void

add(

int a,

int b)

void

dfs(

int x)

return;}

intmain

(void

)int root=1;

while

(get_father[root]

) root++

;dfs

(root)

;int res=

max(dp[root][0

],dp[root][1

]); cout<}

ACWing 285 沒有上司的舞會

給定一棵樹,節點編號1 n 1 sim n 1 n,每個節點有個權值,要求選出若干個點,使得沒有兩個點之間有邊,並且總權值和最大。問這個最大權值和。輸入格式 第一行乙個整數n nn。接下來n nn行,第i ii行表示第i ii個節點的權值。再接下來n 1 n 1n 1行,每行輸入一對整數l,k l,...

Acwing 285 沒有上司的舞會

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

Acwing 0x50 動態規劃 沒有上司的舞會

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