沒有上司的晚會 樹形動態規劃

2021-07-11 17:37:23 字數 1589 閱讀 3855

題目大意

有個公司要舉行一場晚會。為了能玩得開心,公司領導決定:如果邀請了某個人,那麼一定不會邀請他的上司(上司的上司,上司的上司的上司……都可以邀請)。每個參加晚會的人都能為晚會增添一些氣氛,求乙個邀請方案,使氣氛值的和最大(氣氛值=邀請的人的氣氛總值)。分析

定義f[i,0]表示不邀請節點i能夠取得的最大值,f[i,1]表示邀請節點i能夠取得的最大值。

一開始以上司為父節點,下屬為葉子節點。同時設乙個總根節點n+1。連著各種沒有上司的boss.

動態轉移方程為

f[i,0]=max 

f[i,1]=max+w[i]

son為子節點。

最後輸出f[n+1,0]**

var

a:array[0..7000,0..7000] of longint;

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

w:array[0..7000] of longint;

v,b:array[0..7000] of boolean;

i,j,k,l:longint;

n,m:longint;

procedure dfs(r:longint);

var i,j,k:longint;

c:longint;

begin

v[r]:=false;

if a[r,0]=0

then

begin

f[r,0]:=0;

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

exit;

end;

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

if v[a[r,i]] then dfs(a[r,i]);

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

begin

c:=a[r,i];

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

then f[r,0]:=f[r,0]+f[c,1]

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

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

end;

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

end;

begin

readln(n);

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

for i:=1 to n do

readln(w[i]);

readln(j,k);

repeat

if j+k=0 then break;

inc(a[k,0]);

b[j]:=true;

a[k,a[k,0]]:=j;

readln(j,k);

until false;

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;

dfs(n+1);

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

end.

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

沒有上司的晚會 樹形DP

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