題目描述
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的兒子為根的最大值之和,再加上...