ural 1039 沒有上司的晚會 樹形dp

2021-07-11 19:22:15 字數 1999 閱讀 7853

description

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

input

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

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

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

最後一行輸入0,0。

output

輸出最大的快樂指數。

sample input

711

1111

11 3

2 36 4

7 44 5

3 50 0

sample output

5

source

ural 1039

分析:這一道題構成了森林,我們要把它變為一棵樹。只要加乙個根節點(root,n+1節點),把森林裡的每棵樹的根都作為root的兒子即可。

f[i,0]表示不邀請i的最大值,f[i,1]表示邀請i的最大值,f[n+1,0]就是所求,m為的兒子的數量,a[i,k]表示i的第k個兒子。

f[i,0]=f[i,0]+max(f[a[i,k],0],f[a[i,k],1])   (1<=k<=m)  

f[i,1]=f[i,1]+f[a[i,k],0]; (1<=k<=m)

vara:array [1..6001,0..6001] of longint;

w:array [1..6001] of longint;

f:array [1..6001,0..1] of longint;

b:array [1..6001] of boolean;

n,x,y,i:longint;

procedure dfs(x:longint);

vari,c:longint;

begin

b[x]:=false;

if a[x,0]=0 then

begin

f[x,0]:=0;

f[x,1]:=w[x];

exit;

end;

for i:=1 to a[x,0] do

if b[a[x,i]] then dfs(a[x,i]);

for i:=1 to a[x,0] do

begin

c:=a[x,i];

if f[c,1]>f[c,0] then

f[x,0]:=f[x,0]+f[c,1]

else f[x,0]:=f[x,0]+f[c,0];

f[x,1]:=f[x,1]+f[c,0];

end;

f[x,1]:=f[x,1]+w[x];

end;

begin

readln(n);

for i:=1 to n do

readln(w[i]);

for i:=1 to n-1 do

begin

readln(x,y);

inc(a[y,0]);

a[y,a[y,0]]:=x;

b[x]:=true;

end;

for i:=1 to n do

begin

if not b[i] then

begin

inc(a[n+1,0]);

a[n+1,a[n+1,0]]:=i;

end;

end;

fillchar(b,sizeof(b),true);

dfs(n+1);

writeln(f[n+1,0]);

end.

沒有上司的晚會

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

沒有上司的晚會 樹形DP

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

沒有上司的晚會(樹形DP)

一道比較水的樹形dp 由題意得,兩個相鄰的節點不能同時取,而且存在負數 dp定義很直接 dp i 1 取 dp i 0 不取 dp陣列存最大值 可以從根節點dfs下去 收集0和1的資訊 狀態轉移也很顯然 dp x 0 max dp y 0 dp y 1 dp x 1 dp y 0 include i...