SSL 1607 没有上司的晚会 树形dp

题意:有n个职员,每个职员都有一个快乐指数和最多一个上司。但邀请了职员就一定不能邀请该职员的上司。问快乐指数最大为多少。


分析:很明显的树形dp。f[i]表示在以i为根的树且选职员i的最大快乐指数。g[i]表示不选职员i的最大快乐指数。

f[i]=sum(g[soni])

g[i]=sum(max(f[soni],g[soni]))


代码:

var
  n,i,root,x,y,e:longint;
  v:array[1..6000] of boolean;
  d,g,f,last:array[1..6000] of longint;
  side:array[1..6000] of record
    x,y,next:longint;
  end;

function max(x,y:longint):longint;
begin
  if x>y then exit(x)
         else exit(y);
end;

procedure add(x,y:longint);
begin
  inc(e);
  side[e].x:=x;
  side[e].y:=y;
  side[e].next:=last[x];
  last[x]:=e;
end;

procedure dp(x:longint);
var
  i:longint;
begin
  f[x]:=d[x];
  i:=last[x];
  while i>0 do
    with side[i] do
    begin
      dp(y);
      f[x]:=f[x]+g[y];
      g[x]:=g[x]+max(f[y],g[y]);
      i:=next;
    end;
end;

begin
  readln(n);
  for i:=1 to n do
    readln(d[i]);
  fillchar(v,sizeof(v),true);
  for i:=1 to n-1 do
  begin
    readln(x,y);
    add(y,x);
    v[x]:=false;
  end;
  for i:=1 to n do
    if v[i] then
    begin
      root:=i;
      break;
    end;
  dp(root);
  writeln(max(f[root],g[root]));
end.


你可能感兴趣的:(SSL 1607 没有上司的晚会 树形dp)