[CODEVS 1380]没有上司的舞会

【问题描述】

  Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。

【输入】

  第一行一个整数N。(1<=N<=6000)
  接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
  接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
  最后一行输入0,0。

【输出】

  输出最大的快乐指数。

【算法分析】

  类似于0-1背包的树形DP基础题,状态转移详见代码。

【程序代码】

 1 var a,fa:array[1..6000] of longint;
 2     f:array[1..6000,0..1] of longint;
 3     s:array[1..6000] of longint;
 4     i,j,k,n,m,ans,u,v:longint;
 5 function max(x,y:longint):longint;
 6 begin
 7     if x>y then exit(x) else exit(y);
 8 end;
 9 procedure dp(x:longint);
10 var i:longint;
11 begin
12     if s[x]=0 then begin f[x,0]:=0; f[x,1]:=a[x]; exit; end;
13     for i:=1 to n do if fa[i]=x then
14     begin
15         dp(i);
16         inc(f[x,0],max(f[i,1],f[i,0]));
17         inc(f[x,1],f[i,0]);
18     end;
19 end;
20 begin
21     readln(n);
22     for i:=1 to n do readln(a[i]);
23     for i:=1 to n-1 do
24     begin
25         readln(u,v);
26         fa[u]:=v;
27         inc(s[v]);
28     end;
29     readln(u,v);
30     for i:=1 to n do if fa[i]=0 then k:=i;
31     for i:=1 to n do f[i,1]:=a[i];
32     dp(k);
33     writeln(max(f[k,1],f[k,0]));
34 end.

 声明:本博文为博主原创博文,未经允许请勿转载。

posted on 2016-02-16 11:28  Double680  阅读(152)  评论(0编辑  收藏  举报

导航