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, ...
随机推荐
- 从头认识Spring-1.9 内部类注入Bean
这一章节我们来讨论一下内部类注入Bean. 1.domain 蛋糕类:(跟前一章节的一样) package com.raylee.my_new_spring.my_new_spring.ch01.to ...
- UITextView获取光标位置
UITextRange *range = textView.selectedTextRange; //光标位置 CGRect rect = [textView caretRectForPositio ...
- P1606 [USACO07FEB]白银莲花池Lilypad Pond
这个题其实算是个最短路计数,建图的直观思想很简单,但是很显然有一个地方没法处理,就是有的时候通过两条路走到同一个地方的话方案数会计算两次.我们发现加上原有的莲花就很难处理,会计算重复.我们要想办法避免 ...
- 关于pycharm中pip版本10.0无法使用的解决办法
背景: 近期在利用 pycharm 安装第三方库时会提示 pip 不是最新版本, 因此对 pip 进行更新,但是生成最新版本之后, pip 中由于缺少 main 函数,导致在 pycharm 中无法自 ...
- MVVMLight消息通知实现机制详解(二)
接上文 MVVMLight消息通知实现机制详解(一) 该工具的内部主要逻辑是以字典模式进行储存持有订阅对象设置的传入参数Type类型.Key值.Action.Target(订阅对象本身) 在发生订阅事 ...
- ACM_二维数组的查找
二维数组的查找 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个n*m的二维数组,保证a[i][j] < a[i+1 ...
- 自动保存草稿 asp+ajax自动存稿功能详解(转自影子)
自动保存草稿功能的原理 我们都知道网页是一种无状态的,每次都需要请求,响应,当一次请求完成后就与服务器断开连接了,所以我们不能像网页一样实现实时的交互功能,但是为了满足更多的需求一个比较无敌的程序员还 ...
- AOP注解不起作用的debug结果
经过2天的调试,我发现AOP注解配置不起作用居然是表达式的错误导致的 在xml文件中配置的base-package有关,初步认为@PointCut只能使用base-package..*(..)这样的方 ...
- session一致性架构设计实践.
一.缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建se ...
- SSH Secure Shell Client连接centos6.5时中文字乱码处理
在学习Linux的过程中,最先碰到的是通过SSH终端连接时发现有乱码出现,使用这篇文章先从这里说起. 在 ssh , telnet 终端中文显示乱码解决办法#vim /etc/sysconfig/i1 ...