P1352 没有上司的舞会[树形dp]
题目描述
某大学有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]相关推荐
- 洛谷 P1352 没有上司的舞会(树形 DP)
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- AcWing285. 没有上司的舞会(树形DP)题解
题目传送门 题目描述 Ural大学有N名职员,编号为1~N. 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司. 每个职员有一个快乐指数,用整数 HiHi 给出,其中 1≤i≤N. 现在要 ...
- 洛谷 P1352 没有上司的舞会
洛谷 P1352 没有上司的舞会 Description 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会, ...
- 洛谷P1352 没有上司的舞会(树形DP水题)
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- 洛谷P1352 没有上司的舞会题解
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- 洛谷 P1352 没有上司的舞会(树形dp)
题目描述 某大学有 nn 个职员,编号为 1\ldots n1-n. 他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司. 现在有个周年庆宴会,宴会每邀请来一个职 ...
- P1352 没有上司的舞会
题目描述某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但 ...
- 洛谷 [P1352] 没有上司的舞会
树型DP 一个人不能和他的直接上司一起去,那么就分别保存这个人去和不去的最大值 注意转移方程 #include <iostream> #include <cstring> #i ...
- 树形DP入门题目推荐以及解析
关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...
最新文章
- ios iphonex适配
- 用python玩转数据第四周答案_2020大学mooc用Python玩转数据课后答案
- 看到他我一下子就悟了-- Lambda表达式
- Silverlight 应用程序之间在客户端通信
- 【项目管理】聊聊项目管理几点实践和理解(2)
- 王者荣耀故事站小程序源码/含vue后台
- inno setup 另一个程序正在使用此文件_STEP 7-MicroWIN SMART程序的上传与下载方式
- 本地创建多个ssh-key
- java分部积分任务代码实现_数值积分 Java 实现
- 今天进行的将zzb从apache迁移到nginx
- JSP 页面 嵌入 google API 地图
- eclipse怎么将项目打包成jar文件
- 有些CAD通过Arcgis程序读取后,发现面积不对
- 用Python给喜欢的女孩写一个办公小工具,她说棒极了
- 2009年中国直销业9大主旋律
- java简洁日历代码
- java注解保留两位小数_jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题
- 关于时间与字符串相互转换
- 最近用到ListView需要几人人物,于是整理了下以前看的玄幻小说人名,时间不够,只整理了几本,凑合用着 1》诛仙
- HoneyComb3.0技术系列之StackView
热门文章
- 程序员需知的 58 个网站!个个经典
- Dubbo 没落了吗?
- 中国顶级程序员有多牛?一个弄哭韩国,一个堪称阿里“扫地僧”
- 一份阿里员工排查程序问题的命令列表
- 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
- shell初学之nginx(负载均衡)
- toString和valueOf使得对象访问时显示一个特定格式的字符串,但是可以进行数字运算...
- spark、hive、impala、hbase、gbase在结构化数据方面查询原理对比(含parquet/orc)
- 20150914-构建之法:现代软件工程-阅读笔记
- 撩开云计算神秘面纱之阿里云弹性计算服务篇