沒有上司的舞會

2021-10-23 20:44:21 字數 1467 閱讀 2774

時間限制:c/c++

1秒,其他語言2秒

空間限制:c/c++

32768k,其他語言65536k

64bit io format:

%lld

ural大學有n名職員,編號為1~n。 他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。 每個職員有乙個快樂指數,用整數

hihi 給出,其中 1\leq i\leq n,1\leq i\leq n1≤i≤n,1≤i≤n。

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

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

輸入描述:

第一行乙個整數n。

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

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

最後一行輸入0,0。

輸出描述:

輸出最大的快樂指數。

示例1輸入

複製

711

1111

1132

3647

4453

500

輸出

複製

5
備註:

1≤n≤6000,−128≤hi≤127

樹狀dp問題中在dfs過程中不斷dp求值

dp[i][0]不選i點時,i點及其子樹能選出的最大快樂指數

dp[i][1]表示選擇i點時,i點及其子樹的最大快樂值

狀態轉移:

dp[i][0]+=max(dp[j][0],dp[j][1])//當i點不選時,兒子選與不選

dp[i][1]+=dp[j][0]+hi//選了父親,不能選兒子

(j是i的兒子)

邊界:dp[i][0]=0 dp[i][1]=hi

結果:max(dp[root][0],dp[root][1])

本質:兒子與父親不能同時選

#include

using namespace std;

const

int maxn=

6050

;vector<

int>edge[maxn];;

int ans=0;

int dp[maxn][4

];void

dfs(

int u,

int fa)

ans=

max(ans,

max(dp[u][1

],dp[u][0

]));

}int

main()

dfs(1,

0); cout

}

沒有上司的舞會

題目描述 description ural大學有n個職員,編號為1 n。他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。輸入描述 input descri...

沒有上司的舞會

ural大學有 n 個職員,編號為 1 n 他們有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。每個職員有乙個快樂指數。現在有個周年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。第一行乙個整數n。1 n 6000 接下來n行,第i 1行表示...

沒有上司的舞會

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