洛谷P1352 沒有上司的舞會 楊子曰題目

2021-08-17 21:56:25 字數 2782 閱讀 8910

題目描述

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

輸入第一行乙個整數n。(1<=n<=3000)

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

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

最後一行輸入0,0。

輸出輸出最大的快樂指數。

樣例輸入

711

1111

1132

3647

4453

500

樣例輸出

5
一道因缺思廳的題目(我想問的是為什麼,職員不願意看到自己的上司,楊子曰:舞會是乙個拍上司馬屁的好機會呀!)

好,佷顯然職員之間形成了一棵樹的關係,所以很容易想到使用——樹形dp

楊子曰:幾乎所有樹形dp,f[i][j]的第一維都表示以i為根節點的這棵子樹

那第二維呢?對於這道題目而言,每個職員無非就是兩種情況——取或不取,so,楊子曰:f[i][0/1]表示第i名職員取或不取時,以i為根結點的這棵子樹的最大快樂指數

狀態一出來,轉移就很簡單了,f[i][0]和f[i][1]分開來更新,如果i不取,那麼他的兒子都可以取(也可以不取,搞個max),也就是說f[i][0]=sigma(max(f[son][1],f[son][0]))

再說f[i][1],當你取了i以後,他的兒子都不能選,so,f[i][1]=sigma(f[son][0])

轉移也被搞定了,巴特(but)還有乙個嚴重的問題,算f[i][0/1]的時候,都要算好他的兒子,那按什麼順序更新呢,相信有人也想到了——dfs

ok,完事

破天荒pascal**:

var

l:array[

1..30000,0.

.3000

]of longint;

f:array[

1..30000,0.

.1]of longint;

a:array[

1..30000

]of longint;

b:array[

1..30000

]of boolean;

i,j,n,x,y:longint;

function max

(a,b:longint)

:longint;

begin

if a>b then exit

(a);

exit

(b);

end;

procedure dfs

(x:longint)

; var

i,s:longint;

begin

if l[x,0]

=0 then exit;

for i:

=1 to l[x,0]

dodfs

(l[x,i]);

s:=0

;for i:

=1 to l[x,0]

do s:

=s+f[l[x,i],0

];f[x,1]

:=s+a[x]

; s:=0

;for i:

=1 to l[x,0]

do s:

=s+max

(f[l[x,i],0

],f[l[x,i],1

]); f[x,0]

:=s;

end;

begin

read

(n);

for i:

=1 to n do

b[i]:=

false

;for i:

=1 to n do

l[i,0]

:=0;

for i:

=1 to n do

read

(a[i]);

for i:

=1 to n-

1do begin

read

(x,y)

;inc

(l[y,0]

);l[y,l[y,0]

]:=x; end;

read

(x,y)

;for i:

=1 to n do

if l[i,0]

=0then begin

f[i,1]

:=a[i]

; f[i,0]

:=0;

end;

for i:

=1 to n do

for j:

=1 to l[i,0]

do b[l[i,j]]:

=true

;for i:

=1 to n do

ifnot b[i]

then break

;dfs

(i);

write

(max

(f[i,1]

,f[i,0]

));end.

洛谷 P1352 沒有上司的舞會

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

洛谷 P1352 沒有上司的舞會

原題 這道題我非常神奇賴皮的用了拓撲,實際上這是一道樹形dp,但是身為蒟蒻的我覺得拓撲可以寫,結果真的讓我水過了,哈哈哈 用乙個二維陣列模擬每個人參加或者不參加,從最底層的員工開始向上拓撲 by acer.mo include include includeusing namespace std i...

洛谷p1352 沒有上司的舞會

題目已經說了這是一棵樹,而這道題顯然不是重心或者lca之類的東西,所以我們考慮樹形dp。一句廢話 首先考慮如果節點i不去舞會時以i為根的子樹的快樂指數最大值,顯然就是每個以i的兒子為根的子樹的最大值之和。如果節點i參加舞會,那麼相應的最大值就是i的每個兒子都不去時,以i的兒子為根的最大值之和,再加上...