P1352 没有上司的舞会——树形DP入门
P1352 没有上司的舞会
题目描述
某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。
输入输出格式
输入格式:
第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0 0
输出格式:
输出最大的快乐指数。
输入输出样例
树形DP——DFS版
#include<bits/stdc++.h> #define N 6005
using namespace std; int n,r[N],dp[N][],tot,head[N];
struct node{
int to,next;
}e[N]; bool v[N];
void add(int u,int v){
e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
}
//dp[i][0]表示i点不被选择时最大值
//dp[i][1]表示i点被选择时的最大值
void tredp(int u){
dp[u][]=,dp[u][]=r[u];
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
tredp(v);
dp[u][]+=max(dp[v][],dp[v][]);
dp[u][]+=dp[v][];
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&r[i]);
for(int a,b,i=;i<n;i++){
scanf("%d%d",&a,&b);
add(b,a);v[a]=;
}
int root;
for(int i=;i<=n;i++) if(!v[i]) root=i;
tredp(root);
printf("%d\n",max(dp[root][],dp[root][]));
return ;
}
树形DP——倒序队列或栈
#include<bits/stdc++.h> #define N 6005
using namespace std; int n,r[N],dp[N][],tot,head[N];
struct node{
int to,next;
}e[N]; bool v[N];
void add(int u,int v){
e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
}
//dp[i][0]表示i点不被选择时最大值
//dp[i][1]表示i点被选择时的最大值
queue<int>Q;
stack<int>q;
bool vis[N];
void bfs(int root){
Q.push(root);
while(!Q.empty()){
int u=Q.front();Q.pop();q.push(u);
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!vis[v]){
vis[v]=;
Q.push(v);
}
}
}
while(!q.empty()){
int u=q.top();q.pop();
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
dp[u][]+=max(dp[v][],dp[v][]);
dp[u][]+=dp[v][];
}dp[u][]+=r[u];
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&r[i]);
for(int a,b,i=;i<n;i++){
scanf("%d%d",&a,&b);
add(b,a);v[a]=;
}
int root;
for(int i=;i<=n;i++) if(!v[i]) root=i;
bfs(root);
printf("%d\n",max(dp[root][],dp[root][]));
return ;
}
拓扑排序——反向建边
#include<bits/stdc++.h> #define N 6005
using namespace std; int n,r[N],dp[N][],tot,head[N],rd[N];
struct node{
int to,next;
}e[N]; void add(int u,int v){
e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
}
//dp[i][0]表示i点不被选择时最大值
//dp[i][1]表示i点被选择时的最大值
bool v[N];
queue<int>Q;
void topo(){
for(int i=;i<=n;i++) if(!rd[i]) Q.push(i);
while(!Q.empty()){
int u=Q.front();Q.pop();dp[u][]+=r[u];
for(int i=head[u];i;i=e[i].next){
int V=e[i].to;
rd[V]--;
if(!rd[V]) Q.push(V);
dp[V][]+=max(dp[u][],dp[u][]);
dp[V][]+=dp[u][];
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&r[i]);
for(int a,b,i=;i<n;i++){
scanf("%d%d",&a,&b);
add(a,b);rd[b]++;v[a]=;
}
int root;
for(int i=;i<=n;i++) if(!v[i]) root=i;
topo();
printf("%d\n",max(dp[root][],dp[root][]));
return ;
}
P1352 没有上司的舞会——树形DP入门的更多相关文章
- P1352 没有上司的舞会&&树形DP入门
https://www.luogu.com.cn/problem/P1352 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的 ...
- 洛谷P1352 没有上司的舞会——树形DP
第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...
- P1352 没有上司的舞会[树形dp]
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- [luogu]P1352 没有上司的舞会[树形DP]
本Lowbee第一次写树形DP啊,弱...一个变量写错半天没看出来...... 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点 ...
- 洛谷 P1352 没有上司的舞会 树形DP板子
luogu传送门 题目描述: 某大学有n个职员,编号为1~n. 他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司. 现在有个周年庆宴会,宴会每邀请来一个职员都会 ...
- 洛谷 P1352 没有上司的舞会(树形 DP)
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- 『没有上司的舞会 树形DP』
树形DP入门 有些时候,我们需要在树形结构上进行动态规划来求解最优解. 例如,给定一颗\(N\)个节点的树(通常是无根树,即有\(N-1\)条无向边),我们可以选择任意节点作为根节点从而定义出每一颗子 ...
- CodeVS1380 没有上司的舞会 [树形DP]
题目传送门 没有上司的舞会 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个 ...
- 没有上司的舞会 树形dp
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
随机推荐
- srm 539
http://mlz000.github.io/2015/07/15/srm-539/ 250 Description: 从若干个盒子中随意选择几个装石头.每一个盒子容量都有上下限,一旦选择使用某个盒 ...
- [NHibernate] 入门实例 NHibernate 3.3 GA + VS2010 +MySQL
题外话: 中国的技术论坛要赶上stackoverflow的水平.至少还需35年.中国程序猿笔者的特点是:太浮躁,太easy下总结.太自得其乐,虽说写的是为了让别人更好的看.却也演变成了一种" ...
- codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解
秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...
- P3092 [USACO13NOV]没有找零No Change 状压dp
这个题有点意思,其实不是特别难,但是不太好想...中间用二分找最大的可买长度就行了. 题干: 题目描述 Farmer John <= K <= ), each with value .., ...
- bzoj 4003 [JLOI2015]城池攻占 —— 左偏树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...
- scrapy安装及基本使用
前端html, css, js 相关知识 数据库运用 http协议的了解 前后台联动 蜘蛛中间件.下载中间件 下载中间件的地方可以写各种反爬的策略 1.使用pip安装, pip3 install sc ...
- 【知识总结】多项式全家桶(一)(NTT、加减乘除和求逆)
我这种数学一窍不通的菜鸡终于开始学多项式全家桶了-- 必须要会的前置技能:FFT(不会?戳我:[知识总结]快速傅里叶变换(FFT)) 以下无特殊说明的情况下,多项式的长度指多项式最高次项的次数加\(1 ...
- jQuery里$.post请求,后台返回结果为“json”格式,前台解析错误问题记录
在JSP页面使用$.post请求后台返回json数据时,在最后 必须加上返回数据格式为json的才行.不然JSP页面解析会出错.
- RabbitMQ~消费者实时与消息服务器保持通话
这个文章主要介绍简单的消费者的实现,rabbitMQ实现的消费者可以对消息服务器进行实时监听,当有消息(生产者把消息推到服务器上之后),消费者可以自动去消费它,这通常是开启一个进程去维护这个对话,它与 ...
- [ Luogu Contest 10364 ] TG
\(\\\) \(\#A\) 小凯的数字 给出两个整数\(L,R\),从\(L\)到\(R\)按顺序写下来,求生成整数对\(9\)取模后的答案. 例如\(L=8,R=12\),生成的数字是\(8910 ...