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
#
情诗六首
——流沙河
一
虽然美丽
你不是花
园中 盆中 瓶中
鬓上 髻上 襟上
一切为别人装饰的地方
没有别人的位置
要说是花
该是雪花
你跳着回旋舞到人间来
伴着群山沉沉入睡
梦见你的故乡
那蓝色的海洋
二
回忆走过的路
使我暗自惊心
为什么要这样曲曲弯弯
弯弯曲曲 浪费着生命
如果走成一条直线
岂不节省许多光阴
我才明白
原来步步都在向你靠近
要不是这样弯曲地走
我们将永远地陌生
迅速一秒就不再有相逢
恰如两颗运行着的星星
四
远远地望我
是一座雪山
使你眼中结冰
心上生寒
没有花香鸟语
没有人烟
你来
耳朵贴在我的胸前
听岩浆在呼啸
浪滚波翻
相信我是一座火山
虽然沉睡多年
五
你要好好爱你自己
因为你是一个奇迹
从溷浊的池水中生长出来
不沾染半点污泥
你是一朵雪白的荷花
孤单单照影在秋塘里
你有一颗太纯洁的心
使你忘却自己的美丽
六
我们将为生活终日奔忙
早晨你送我出门
傍晚你等我回家
我们勤劳如暮春的工蜂
自己采的花最香
自己做的蜜最甜
让花常开在家里
让燕子年年来拜访我们
我们将珍惜每一个幽夜
在灯下读书
在窗前望月
在枕边谈笑
在梦中听屋上的风雨
和邻家的鸡啼
让尘世的纷争遗忘我们
让岁月在门外悄悄地走过