ACWing 285 沒有上司的舞會

2021-10-20 08:15:11 字數 1734 閱讀 4405

給定一棵樹,節點編號1∼n

1\sim n

1∼n,每個節點有個權值,要求選出若干個點,使得沒有兩個點之間有邊,並且總權值和最大。問這個最大權值和。

輸入格式:

第一行乙個整數n

nn。接下來n

nn行,第i

ii行表示第i

ii個節點的權值。再接下來n−1

n-1n−

1行,每行輸入一對整數l,k

l, k

l,k,表示l

ll是k

kk的孩子。

輸出格式:

輸出最大的權值總和。

資料範圍:

1 ≤n

≤6000

1\le n\le 6000

1≤n≤60

00−

128≤ai

≤127

-128\le a_i\le 127

−128≤a

i​≤1

27a

ia_i

ai​是節點i

ii的權值

設f [i

][0]

f[i][0]

f[i][0

]是以i

ii為根節點的子樹中,不包含i

ii的所有合法選法的最大權值,而f[i

][0]

f[i][0]

f[i][0

]是以i

ii為根節點的子樹中,包含i

ii的所有合法選法的最大權值。設c(i

)c(i)

c(i)

是i

ii的全體孩子節點,則有:f[

i][1

]=∑f

[c(i

)][0

]\beginf[i][0]=\sum \max_\ \\f[i][1]=\sum f[c(i)][0] \end

f[i][1

]=∑f

[c(i

)][0

]​意思是,如果不選i

ii,那麼每個孩子的子樹,其根可選可不選,那就挑個總權值更大的方案;如果選i

ii,那麼每個孩子的子樹,其根必不選。**如下:

#include

#include

using

namespace std;

const

int n =

6010

;// 用鄰接表存樹

int h[n]

, e[n]

, ne[n]

, idx;

int f[n][2

];int a[n]

;bool has_father[n]

;void

add(

int a,

int b)

intdfs

(int u)

}int

main()

// 找樹根

int root =1;

while

(has_father[root]

) root++

;dfs

(root)

; cout <<

max(f[root][0

], f[root][1

])<< endl;

return0;

}

時空複雜度o(n

)o(n)

o(n)

AcWing 285 沒有上司的舞會

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

Acwing 285 沒有上司的舞會

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

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

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