CODEVS1380 没有上司的舞会 (树形DP)
2024-10-12 07:42:49
f[i,0] 表示 第i个人不参加舞会
f[i,1] 表示 第i个人参加舞会
f[i,1]=sigma(f[j,0])+v[i] j 为 i 的孩子
f[i,1]=sigma(max(f[j,0],f[j,1])) j 为 i 的孩子
ans=max(f[root,0],f[root,1])
Program CODEVS1380;
type arr=record
u,v,next:longint;
end;
const maxn=;
var eg:array[..maxn] of arr;
last:array[..maxn] of longint;
a:array[..maxn] of longint;
f:array[..maxn,..] of longint;
fa:array[..maxn] of longint;
i,n,u,v,j,root:longint;
procedure add(u,v:longint);
begin
inc(j);
eg[j].u:=u;
eg[j].v:=v;
eg[j].next:=last[u];
last[u]:=j;
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
procedure dfs(u:longint);
var i,v,sum1,sum2:longint;
begin
if last[u]=- then
begin
f[u,]:=;
f[u,]:=a[u];
exit;
end;
i:=last[u]; sum1:=; sum2:=;
while i<>- do
begin
v:=eg[i].v;
dfs(v);
sum1:=sum1+f[v,];
sum2:=sum2+max(f[v,],f[v,]);
i:=eg[i].next;
end;
f[u,]:=sum2;
f[u,]:=sum1+a[u];
end;
begin
readln(n);
j:=-;
for i:= to maxn do last[i]:=-;
for i:= to n do readln(a[i]);
readln(v,u);
while (v<>) and (u<>) do
begin
fa[v]:=u;
add(u,v);
readln(v,u);
end;
for i:= to n do if fa[i]= then root:=i;
dfs(root);
writeln(max(f[root,],f[root,]));
end.
最新文章
- JQuery 获得div绝对,相对位置的坐标方法
- VS的代码分析工具
- [Android Memory] App调试内存泄露之Context篇(上)
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
- Java学习第四篇:数组,排序,查找
- Java基础知识强化之网络编程笔记12:TCP之TCP协议上传文本文件并给出反馈
- AllocConsole
- UESTC_方老师的分身 II CDOJ 915
- qt学习001之运行对话框
- .NET Core 如何调用 WebService
- UVA1627-Team them up!(二分图判断+动态规划)
- couldn&#39;t locate lint-gradle-api-26.1.2.jar for flutter project
- SkylineGlobe SFS发布的WFS和WMS服务测试
- Hdu2204 Eddy&#39;s爱好 2017-06-27 16:11 43人阅读 评论(0) 收藏
- 【C++】不要依赖编译器的默认初始值
- python日记---day1
- phpcms 仿站小结
- nginx配置解决vue单页面打包文件大,首次加载慢的问题
- java学习笔记16--I/O流和文件
- IBM MQ 2035 或 2013认证错误的解决方法