题意:有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.