沒有上司的舞會

2022-05-09 15:24:38 字數 1527 閱讀 4824

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

輸入格式:

第一行乙個整數n。(1<=n<=6000)

接下來n行,第i+1行表示i號職員的快樂指數ri。(-128<=ri<=127)

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

最後一行輸入0 0

輸出格式:

輸出最大的快樂指數。

輸入樣例#1: 

711

1111

11 3

2 36 4

7 44 5

3 50 0

輸出樣例#1: 

5

樹型dp入門題。

對於樹中的每乙個點,要麼選,要麼不選。若選的話,他的孩子節點一定不能選;不選的話,他的孩子節點可以選或不選。

所以開乙個二維陣列,其中 dp[i][0] 代表在i沒選的情況下,dp[i][1]是選了的情況下。

那麼轉移方程

dp[i][0] = sum(max(dp[j][0], dp[j][1]));

dp[i][1] = sum(dp[j][1]) + a[i];

思路是dfs。回溯的時候進行計算。

當遞迴到葉節點的時候,若沒取,返回0;否則返回a[i]。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8const

int maxn = 1e4 + 5;9

inta[maxn], pa[maxn], n;

10 vectorv[maxn];

11int dp[maxn][2

];12

int dfs(int now, int

flag)

1321

if(flag) dp[now][flag] +=a[now];

22return

dp[now][flag];23}

24int

main()

2533

int x = 1;34

while(pa[x]) x++; //

找根節點

35 v[0].push_back(x); //

理論上取max(dfs(1, 1),dfs(1, 0))),但事實上可以給節點加乙個父親,然後直接dfs(0, 0);

36 printf("

%d\n

", dfs(0, 0

));37

return0;

38 }

沒有上司的舞會

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

沒有上司的舞會

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

沒有上司的舞會

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