题目描述

某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

输入输出格式

输入格式:

第一行一个整数N。(1<=N<=6000)

接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)

接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。

最后一行输入0 0

输出格式:

输出最大的快乐指数。

输入输出样例

输入样例#1:

7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0

输出样例#1:

5

解析:

这是一道相当经典的树形dp入门题。


树形\(dp\),顾名思义,就是在树这种数据结构上做\(dp\),所以要学习树形\(dp\),首先要学习树的储存结构和遍历方法。

显然,在这道题中,我们可以以树的深度作为阶段,用某个人的以他为根的子树的最优解作为状态,决策就是某个人来与不来。

那岂不就是直接开一个一维数组\(dp[]\)来做就得了?

其实不然。

我们会发现这样做忽略了在做当前决策时,之前做过的决策实际上是会当前决策影响的。

考虑如下情形:如果一个人的上司来了,那么他只有不来一种选择;如果一个人的上司没来,那么他既可以来也可以不来。然后这个人的决策又会影响到他的下属,继而传播到整颗子树。

因此,这道题是有后效性的

不急,对于这种情况,我们再加一维把任意一个人来与不来的情况分开记录,就不会使最优解互相影响了。

假设\(dp[i][1]\)表示第\(i\)个人当前如果来的话的最优解,\(dp[i][0]\)就表示第\(i\)个人不来时的最优解。

初始化就是对于任意的一个人\(i\),有\(dp[i][0]=0,dp[i][1]=w[i]\),其中\(w[i]\)表示这个人的嗑嗨指数。

状态转移方程:
\[ {dp[i][1]+=\sum_{j\epsilon son(i) }{dp[j][0]}}, {dp[i][0]=\sum_{j \epsilon son(i)} max(dp[j][0],dp[j][1])} \]
我们可以\(dfs\)一遍整棵树,在向下递归时初始化,向上递归时做\(dp\)。

参考代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define ri register int
const int N=6010;
const int INF=0x3f3f3f3f;
using namespace std;
inline int read()
{int f=1,x=0;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
struct rec{int next,ver;
}g[N<<1];
int head[N],tot,n,w[N];
int dp[N][2];
bool v[N],fa[N];
void add(int x,int y)
{g[++tot].ver=y;g[tot].next=head[x],head[x]=tot;
}
void calc(int x)
{v[x]=1;dp[x][0]=0;dp[x][1]=w[x];for(ri i=head[x];i;i=g[i].next){int y=g[i].ver;if(v[y]==1) continue;calc(y);dp[x][0]+=max(dp[y][1],dp[y][0]);dp[x][1]+=dp[y][0];}
}
int main()
{n=read();for(ri i=1;i<=n;i++) w[i]=read();int x,y;for(ri i=1;i<n;i++){x=read(),y=read();add(y,x);fa[x]=1;}getchar();getchar();int root;for(ri i=1;i<=n;i++){if(!fa[i]){root=i;break;}}calc(root);cout<<max(dp[root][1],dp[root][0])<<endl;return 0;
}

转载于:https://www.cnblogs.com/DarkValkyrie/p/11143932.html

P1352 没有上司的舞会[树形dp]相关推荐

  1. 洛谷 P1352 没有上司的舞会(树形 DP)

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  2. AcWing285. 没有上司的舞会(树形DP)题解

    题目传送门 题目描述 Ural大学有N名职员,编号为1~N. 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司. 每个职员有一个快乐指数,用整数 HiHi 给出,其中 1≤i≤N. 现在要 ...

  3. 洛谷 P1352 没有上司的舞会

    洛谷 P1352 没有上司的舞会 Description 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会, ...

  4. 洛谷P1352 没有上司的舞会(树形DP水题)

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  5. 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  6. 洛谷P1352 没有上司的舞会题解

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  7. 洛谷 P1352 没有上司的舞会(树形dp)

    题目描述 某大学有 nn 个职员,编号为 1\ldots n1-n. 他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司. 现在有个周年庆宴会,宴会每邀请来一个职 ...

  8. P1352 没有上司的舞会

    题目描述某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但 ...

  9. 洛谷 [P1352] 没有上司的舞会

    树型DP 一个人不能和他的直接上司一起去,那么就分别保存这个人去和不去的最大值 注意转移方程 #include <iostream> #include <cstring> #i ...

  10. 树形DP入门题目推荐以及解析

    关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...

最新文章

  1. ios iphonex适配
  2. 用python玩转数据第四周答案_2020大学mooc用Python玩转数据课后答案
  3. 看到他我一下子就悟了-- Lambda表达式
  4. Silverlight 应用程序之间在客户端通信
  5. 【项目管理】聊聊项目管理几点实践和理解(2)
  6. 王者荣耀故事站小程序源码/含vue后台
  7. inno setup 另一个程序正在使用此文件_STEP 7-MicroWIN SMART程序的上传与下载方式
  8. 本地创建多个ssh-key
  9. java分部积分任务代码实现_数值积分 Java 实现
  10. 今天进行的将zzb从apache迁移到nginx
  11. JSP 页面 嵌入 google API 地图
  12. eclipse怎么将项目打包成jar文件
  13. 有些CAD通过Arcgis程序读取后,发现面积不对
  14. 用Python给喜欢的女孩写一个办公小工具,她说棒极了
  15. 2009年中国直销业9大主旋律
  16. java简洁日历代码
  17. java注解保留两位小数_jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题
  18. 关于时间与字符串相互转换
  19. 最近用到ListView需要几人人物,于是整理了下以前看的玄幻小说人名,时间不够,只整理了几本,凑合用着 1》诛仙
  20. HoneyComb3.0技术系列之StackView

热门文章

  1. 程序员需知的 58 个网站!个个经典
  2. Dubbo 没落了吗?
  3. 中国顶级程序员有多牛?一个弄哭韩国,一个堪称阿里“扫地僧”
  4. 一份阿里员工排查程序问题的命令列表
  5. 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
  6. shell初学之nginx(负载均衡)
  7. toString和valueOf使得对象访问时显示一个特定格式的字符串,但是可以进行数字运算...
  8. spark、hive、impala、hbase、gbase在结构化数据方面查询原理对比(含parquet/orc)
  9. 20150914-构建之法:现代软件工程-阅读笔记
  10. 撩开云计算神秘面纱之阿里云弹性计算服务篇