Codevs P1380 没有上司的舞会

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题,每个节点求得最大值显然只有两种情况

  1. 选该节点(不能选其子节点)
  2. 不选该节点(可以选子节点或不选子节点(因为可能选孙节点更优));

    那么动归方程就很显然(一点也不显然/(ㄒ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

#

情诗六首

——流沙河

虽然美丽
你不是花
园中 盆中 瓶中
鬓上 髻上 襟上
一切为别人装饰的地方
没有别人的位置
要说是花
该是雪花
你跳着回旋舞到人间来
伴着群山沉沉入睡
梦见你的故乡
那蓝色的海洋



回忆走过的路
使我暗自惊心
为什么要这样曲曲弯弯
弯弯曲曲 浪费着生命
如果走成一条直线
岂不节省许多光阴
我才明白
原来步步都在向你靠近
要不是这样弯曲地走
我们将永远地陌生
迅速一秒就不再有相逢
恰如两颗运行着的星星



远远地望我
是一座雪山
使你眼中结冰
心上生寒
没有花香鸟语
没有人烟
你来
耳朵贴在我的胸前
听岩浆在呼啸
浪滚波翻
相信我是一座火山
虽然沉睡多年



你要好好爱你自己
因为你是一个奇迹
从溷浊的池水中生长出来
不沾染半点污泥
你是一朵雪白的荷花
孤单单照影在秋塘里
你有一颗太纯洁的心
使你忘却自己的美丽



我们将为生活终日奔忙
早晨你送我出门
傍晚你等我回家
我们勤劳如暮春的工蜂
自己采的花最香
自己做的蜜最甜
让花常开在家里
让燕子年年来拜访我们
我们将珍惜每一个幽夜
在灯下读书
在窗前望月
在枕边谈笑
在梦中听屋上的风雨
和邻家的鸡啼
让尘世的纷争遗忘我们
让岁月在门外悄悄地走过

这里写图片描述
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章