洛谷P1352 沒有上司的舞會(樹形DP)

2021-10-09 02:44:37 字數 2067 閱讀 4956

某大學有 n 個職員,編號為 1…n

1\ldots n

1…n。

他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。

現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數 r

ir_i

ri​,但是呢,如果某個職員的直接上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。

所以,請你程式設計計算,邀請哪些職員可以使快樂指數最大,求最大的快樂指數。

輸入格式

輸入的第一行是乙個整數 n。

第 2 到第 (n+

1)

(n + 1)

(n+1

)行,每行乙個整數,第 (i+

1)

(i+1)

(i+1

) 行的整數表示 i

ii 號職員的快樂指數 r

ir_i

ri​ .第 (n+

2)

(n + 2)

(n+2

)到第 2n2n

2n行,每行輸入一對整數 l,k

l, k

l,k,代表 k 是 l 的直接上司。

輸出格式

輸出一行乙個整數代表最大的快樂指數。輸入7

1111

1111 3

2 36 4

7 44 5

3 5輸出

5說明/提示

資料規模與約定

對於 100

%100\%

100%

的資料,保證 1≤n

≤6×1

03

1\leq n \leq 6 \times 10^3

1≤n≤6×

103,−

128≤ri

≤1≤l

,k≤n

-128 \leq r_i\leq1 \leq l, k \leq n

−128≤r

i​≤1

≤l,k

≤n,且給出的關係一定是一棵樹。

emmm,蒟蒻發現自己的dp太辣雞了。。。所以來練練dp,這題的話實際上應該算是樹dp的入門題吧,轉移還是挺好想的。

每次在每個節點都會有個選擇,就是選還是不選,如果選的話,那麼它的兒子節點就不能選,如果不選的話它的兒子節點就可以選,也就是說我們需要另開一維狀態來記錄每個節點是否選自己的情況,那麼就很容易得出如下方程:

dp[x][0

]+=max(0

,max

(dp[v][1

],dp[v][0

]));

//如果不選當前節點,那麼兒子節點可以任意選

dp[x][1

]+=max(0

,dp[v][0

]);//如果選擇當前節點,那麼只能選擇兒子節點不存在的情況

以下是ac**:

#include

using

namespace std;

const

int mac=

1e4+10;

int a[mac]

,dp[mac][3

],father[mac]

;vector<

int>g[mac]

;void

dfs(

int x,

int fa)

}int

main

(int argc,

char

const

*ar**)

int root=0;

for(

int i=

1; i<=n; i++)if

(!father[i]

)dfs

(root,0)

;printf

("%d\n"

,max

(dp[root][1

],dp[root][0

]));

return0;

}

洛谷 P1352 沒有上司的舞會

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

洛谷 P1352 沒有上司的舞會

原題 這道題我非常神奇賴皮的用了拓撲,實際上這是一道樹形dp,但是身為蒟蒻的我覺得拓撲可以寫,結果真的讓我水過了,哈哈哈 用乙個二維陣列模擬每個人參加或者不參加,從最底層的員工開始向上拓撲 by acer.mo include include includeusing namespace std i...

洛谷p1352 沒有上司的舞會

題目已經說了這是一棵樹,而這道題顯然不是重心或者lca之類的東西,所以我們考慮樹形dp。一句廢話 首先考慮如果節點i不去舞會時以i為根的子樹的快樂指數最大值,顯然就是每個以i的兒子為根的子樹的最大值之和。如果節點i參加舞會,那麼相應的最大值就是i的每個兒子都不去時,以i的兒子為根的最大值之和,再加上...