沒有上司的舞會

2021-08-08 18:04:20 字數 1383 閱讀 9963

題目描述

某大學有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:

7 1

1 1

1 1

1 1

1 3

2 3

6 4

7 4

4 5

3 5

0 0

輸出樣例#1:

5這道題可以說是樹形dp的入門題。設二維陣列f[i][0]表示不選i

參加舞會時i下屬的最大快樂指數,f[i][1]表示選i參加舞會時下

屬的最大快樂指數。

可得出dp轉移方程

f[x][0]+=max(f[a[x][i]][0],f[a[x][i]][1]);

f[x][1]+=f[a[x][i]][0];

由於dp是乙個遞迴的過程,所以用void來寫,完整的void如下

void dp(int x)

}

本題是從樹根開始的樹形dp,所以還需找到樹根。找到樹根,

直接做一遍dp,輸出max(f[root][1],f[root][0])即可。

code:

#include

#include

using

namespace

std;

int i,j,k,n,m,tot,ans,root,f[6005][2],fa[6005];

vector

a[6005];

int read()

int maxx(int a,int b)

void dp(int x)

}int main()

for(int i=1;i<=n;i++) if(fa[i]==i)

dp(root);

printf("%d",maxx(f[root][1],f[root][0]));

return

0;}

沒有上司的舞會

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

沒有上司的舞會

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

沒有上司的舞會

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