Codevs P1380 沒有上司的舞會
題目描述 Description
Ural大學有N個職員,編號爲1~N。他們有從屬關係,也就是說他們的關係就像一棵以校長爲根的樹,父結點就是子結點的直接上司。每個職員有一個快樂指數。現在有個週年慶宴會,要求與會職員的快樂指數最大。但是,沒有職員願和直接上司一起與會。
輸入輸出
輸入描述 Input Description
第一行一個整數N。(1<=N<=6000)
接下來N行,第i+1行表示i號職員的快樂指數Ri。(-128<=Ri<=127)
接下來N-1行,每行輸入一對整數L,K。表示K是L的直接上司。
最後一行輸入0,0。
輸出描述 Output Description
輸出最大的快樂指數。
樣例 Sample
樣例輸入 Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
樣例輸出 Sample Output
5
數據範圍及提示 Data Size & Hint
各個測試點1s
分析
該題爲樹形DP題,每個節點求得最大值顯然只有兩種情況
- 選該節點(不能選其子節點)
不選該節點(可以選子節點或不選子節點(因爲可能選孫節點更優));
那麼動歸方程就很顯然(一點也不顯然/(ㄒoㄒ)/~~);
f[i,0]表示不選第i個節點
f[i,1]表示選擇第i各節點
p^.e表示該點的子節點
root表示根
那麼f[i,1]:=f[i,1]+f[p^.e,0];(注意是累加,因爲兄弟間不互相影響)
f[i,0]:=f[i,0]+max(f[p^.e,0],f[p^.e,1]);(同上)
ans:=max(f[root,1],f[root,0])
代碼如下
program p1380;
type point=^rec;
rec=record
e:longint;
s:point;
end;
var conviviality:array[1..6000] of longint;
vertex:array[1..6000] of point;
s,e,i,j,k,n,root:longint;
father:array[1..6000] of integer;
f:array[1..6000,0..1] of longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
procedure dp(head:longint);
var p:point;
begin
p:=vertex[head];
if p=nil
then
begin
f[head,1]:=conviviality[head];
exit;
end;
f[head,1]:=conviviality[head];
while p<>nil do
begin
dp(p^.e);
f[head,1]:=f[head,1]+f[p^.e,0];
f[head,0]:=f[head,0]+max(f[p^.e,1],f[p^.e,0]);
p:=p^.s;
end;
end;
procedure insert(s,e:longint);
var p:point;
begin
new(p);
p^.e:=e;
p^.s:=vertex[s];
vertex[s]:=p;
end;
begin
readln(n);
for i:=1 to n do
readln(conviviality[i]);
fillchar(f,sizeof(f),0);
fillchar(father,sizeof(father),0);
readln(e,s);
while (s<>0) and (e<>0) do
begin
insert(s,e);
father[e]:=s;
readln(e,s);
end;
for i:=1 to n do
if father[i]=0
then break;
root:=i;
dp(root);
write(max(f[root,1],f[root,0]));
end.
評測結果
運行結果
測試點#1.in 結果:AC 內存使用量: 256kB 時間使用量: 1ms
測試點#10.in 結果:AC 內存使用量: 496kB 時間使用量: 1ms
測試點#2.in 結果:AC 內存使用量: 256kB 時間使用量: 1ms
測試點#3.in 結果:AC 內存使用量: 256kB 時間使用量: 1ms
測試點#4.in 結果:AC 內存使用量: 256kB 時間使用量: 1ms
測試點#5.in 結果:AC 內存使用量: 256kB 時間使用量: 1ms
測試點#6.in 結果:AC 內存使用量: 256kB 時間使用量: 1ms
測試點#7.in 結果:AC 內存使用量: 256kB 時間使用量: 1ms
測試點#8.in 結果:AC 內存使用量: 496kB 時間使用量: 2ms
測試點#9.in 結果:AC 內存使用量: 496kB 時間使用量: 1ms
#
情詩六首
——流沙河
一
雖然美麗
你不是花
園中 盆中 瓶中
鬢上 髻上 襟上
一切爲別人裝飾的地方
沒有別人的位置
要說是花
該是雪花
你跳着迴旋舞到人間來
伴着羣山沉沉入睡
夢見你的故鄉
那藍色的海洋
二
回憶走過的路
使我暗自驚心
爲什麼要這樣曲曲彎彎
彎彎曲曲 浪費着生命
如果走成一條直線
豈不節省許多光陰
我才明白
原來步步都在向你靠近
要不是這樣彎曲地走
我們將永遠地陌生
迅速一秒就不再有相逢
恰如兩顆運行着的星星
四
遠遠地望我
是一座雪山
使你眼中結冰
心上生寒
沒有花香鳥語
沒有人煙
你來
耳朵貼在我的胸前
聽岩漿在呼嘯
浪滾波翻
相信我是一座火山
雖然沉睡多年
五
你要好好愛你自己
因爲你是一個奇蹟
從溷濁的池水中生長出來
不沾染半點污泥
你是一朵雪白的荷花
孤單單照影在秋塘裏
你有一顆太純潔的心
使你忘卻自己的美麗
六
我們將爲生活終日奔忙
早晨你送我出門
傍晚你等我回家
我們勤勞如暮春的工蜂
自己採的花最香
自己做的蜜最甜
讓花常開在家裏
讓燕子年年來拜訪我們
我們將珍惜每一個幽夜
在燈下讀書
在窗前望月
在枕邊談笑
在夢中聽屋上的風雨
和鄰家的雞啼
讓塵世的紛爭遺忘我們
讓歲月在門外悄悄地走過