沒有上司的晚會 樹形DP

2021-07-11 19:22:15 字數 1728 閱讀 1360

題意/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:

輸出最大的快樂指數。

題解/

solution

根據題目給出的矛盾關係寫出動規方程:

t[i]表示不邀請i,以i為根的子樹所獲得的最大值

f[i]表示邀請i,以i為根的子樹所獲得的最大值

轉移如下:

inc(t[v],f[son[d[v]]]);

inc(f[v],max(t[son[d[v]]],f[son[d[v]]]));

**

/code:

var

v:array [0..6001] of boolean;

t,f,d,son,ls:array [0..6001] of longint;

n,tt:longint;

function max(o,p:longint):longint;

begin

if o>p then max:=o

else max:=p;

end;

procedure dfs(v:word);

begin

while d[v]>0 do

begin

dfs(son[d[v]]);

inc(t[v],f[son[d[v]]]);

inc(f[v],max(t[son[d[v]]],f[son[d[v]]]));

d[v]:=ls[d[v]];

end;

end;

procedure init;

var i,x,y:longint;

begin

read(n);

for i:=1 to n do read(t[i]);

fillchar(v,sizeof(v),1);

tt:=n*(n+1) div 2;

for i:=1 to n-1 do

begin

read(x,y);

son[i]:=x; ls[i]:=d[y];

d[y]:=i;

if v[x] then begin dec(tt,x); v[x]:=false; end;

end;

end;

begin

init;

dfs(tt);

writeln(max(t[tt],f[tt]));

end.

沒有上司的晚會(樹形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...

沒有上司的晚會 樹形DP

某公司要舉辦一次晚會,但是為了使得晚會的氣氛更加活躍,每個參加晚會的人都不希望在晚會中見到他的上司,要不然他們會很掃興。現在已知每個人的活躍指數和上司關係 當然不可能存在環 求邀請哪些人來能使得晚會的總活躍指數最大。利 用鏈 式儲存結 構。對於 每乙個頂 點,開一 條鏈,依 次儲存以 該點為起 點的...

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

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