hdu_Anniversary party_(树形DP入门题)
2024-10-13 07:48:37
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520
题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直接上司将不嫩参加,问最大的快乐值为多少
题解:入门的树形DP题,dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去。
#include<cstdio>
#define FFC(i,a,b) for(int i=a;i<=b;i++)
#define max(a,b) ((a)>(b)?(a):(b))
const int maxn=;
int n,c[maxn],v[maxn],g[maxn],nxt[maxn],ed,xx,yy,ik,f[maxn],root,dp[maxn][];
void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
void fuck(int now){
dp[now][]=c[now];
for(int i=g[now];i;i=nxt[i]){
fuck(v[i]);
dp[now][]+=max(dp[v[i]][],dp[v[i]][]);
dp[now][]+=dp[v[i]][];
}
}
int main(){
while(~scanf("%d",&n)){
FFC(i,,n)scanf("%d",&c[i]);
for(ik=ed=,root=;ik<=n;ik++)g[ik]=,f[ik]=ik;
while(scanf("%d%d",&xx,&yy),xx+yy)adg(yy,xx),f[xx]=yy;
FFC(i,,n)dp[i][]=dp[i][]=;
while(f[root]!=root)root=f[root];
fuck(root);
printf("%d\n",max(dp[root][],dp[root][]));
}
return ;
}
最新文章
- CSS手动改变DIV高宽
- sql-ASCII函数运用
- office project 激活
- iOS - 日期的时间差(某年某月某日的某一天。。。)
- 如何用ZBrush雕刻出栩栩如生的头发(二)
- 《深入Java虚拟机学习笔记》- 第3章 安全
- win32多线程学习总结:同步机制critical sections
- 【UVA1331】关于最优三角剖分
- SQL 查询字段为值不为空
- Python简记
- WAV音频格式分析
- 5.3、Android Studio录像
- 手把手教你画一个 逼格满满圆形水波纹loadingview Android
- 质量:“PM,你怎么可以放弃我?!”
- JSON字符串解析成JSON数据格式
- kubernetes核心组件kube-proxy 学习总结
- 20135316王剑桥Linux内核学习记笔记第七周
- JS实现ul,li排序效果
- ORACLE的init.ora配置文件中参数详解
- 模仿qq列表信息滑动删除效果