TYVJ 1052 没有上司的舞会

var
	f:array[0..6000,0..1]of longint;
	l,r,a:array[0..6000]of longint;
	v:array[0..6000]of boolean;
	n,ans:longint;
	
function max(a,b:longint):longint;
begin if a>b then exit(a) else exit(b);end;

function dp(x,y:longint):longint;
begin
	if x=0 then exit(0);
	if f[x,y]<>maxlongint then exit(f[x,y]);
	if y=1 then f[x,y]:=dp(l[x],0)+a[x]+max(dp(r[x],1),dp(r[x],0)) else
	f[x,y]:=max(dp(l[x],1),dp(l[x],0))+dp(r[x],0);
	exit(f[x,y]);
end;

procedure init;
var i,x,b:longint;
begin
	readln(n);ans:=0;
	for i:=1 to n do begin f[i,1]:=maxlongint;f[i,0]:=maxlongint;read(a[i]);end;
	while 1<>0 do
	begin
		read(x,b);
		if (x=0)and(b=0) then break;
		if l[b]=0 then l[b]:=x else
		begin
			r[x]:=l[b];
			l[b]:=x;
		end;
		v[x]:=true;
	end;
	for i:=1 to n do if not v[i] then inc(ans,max(dp(i,1),dp(i,0)));
end;

begin
	init;
	writeln(ans);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值