luogu P1352 没有上司的舞会 x
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
输出格式:
输出最大的快乐指数。
输入输出样例
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
5
思路:
拓扑排序+动规
具体方法就是先找到所有的入度为0的点,(最下层的点),入队.从下面往上走,遇到入度为0的入队,并且稍微加一点处理.
首先我们要明确,每个点都有“选”,“不选”两种(来不来),
然后假设v表示当前到了v点,u是他的上司,dp[v][0/1]表示当前点选或者不选时的快乐最大值
那么从当前点到他的上司时,他的上司如果选:dp[u][1]+=dp[v][0];当前点不能选上,如果他的上司不选 dp[u][0]=max(dp[v][0],dp[v][1]);他可以选也可以不选,在两种情况中取大.
那我们就可以在拓扑排序时把这些完成就行了.
坑点:
疑似是没有坑点的.反正我没被坑到hahaha
代码:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath> using namespace std; const int M = ;
int n,ans;
int dp[M][];
/*
我们有两种状态:
选上或是不选,如果选上,用1来表示,里面的值就是它本身的开心值;
不选是0,dp中用0来表示
*/
struct A{
int happys;
int ru;
int dad;
}Ms[M];
queue<int>q; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&Ms[i].happys);
int a,b;///k,l
for(int i=;i<n;i++)
{
scanf("%d%d",&a,&b);
if(a== && b==) break;
Ms[a].dad=b;
Ms[b].ru++;
}
for(int i=;i<=n;i++)
{
///初始化
dp[i][]=Ms[i].happys;
if(Ms[i].ru==) q.push(i);
}
while(!q.empty())
{
int v=q.front();
q.pop();
int u=Ms[v].dad;
if(u)
{
///不让上司来
dp[u][]+=max(dp[v][],dp[v][]);
///上司来了,这个就不能来了
dp[u][]+=dp[v][];
///他的下司已经决定了来还是不来
Ms[u].ru--;
if(Ms[u].ru==) q.push(u);///topo
}
else///没有上司
ans+=max(dp[v][],dp[v][]);///加上寻找最优答案
}
printf("%d\n",ans);
return ;
}
luogu P1352 没有上司的舞会 x的更多相关文章
- [luogu]P1352 没有上司的舞会[树形DP]
本Lowbee第一次写树形DP啊,弱...一个变量写错半天没看出来...... 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点 ...
- LuoGu P1352 没有上司的舞会
题目传送门 这可能是最简单的树形Dp了吧 对于每个人,要么他来,他的下属不来 要么他不来,他的下属爱来不来 于是设计状态: f[i][0/1]表示以i为根的子树中最大能达到的快乐值(i这个人选或者不选 ...
- 洛谷 p1352 没有上司的舞会 题解
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...
- 洛谷P1352 没有上司的舞会——树形DP
第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...
- P1352 没有上司的舞会——树形DP入门
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...
- 洛谷P1352 没有上司的舞会 [2017年5月计划 清北学堂51精英班Day3]
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子 结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职 ...
- 【Luogu】P1352没有上司的舞会(树形DP)
题目链接 设f[i][0]表示第i个人不去舞会时子树的最大欢乐度,f[i][1]表示第i个人去舞会时子树的最大欢乐度. 则有状态转移方程:f[i][0]+=∑max(f[to][0],f[to][1] ...
- P1352 没有上司的舞会&&树形DP入门
https://www.luogu.com.cn/problem/P1352 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的 ...
- 洛谷——P1352 没有上司的舞会
https://www.luogu.org/problem/show?pid=1352#sub 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树, ...
随机推荐
- 微信小程序开发(三)----- 云开发案例
1.发送请求 2.云函数中发送请求,例子request https://github.com/request/request-promise 创建云函数movielist,右键在终端打开,输入 ...
- Git介绍、安装、命令和实战
一.Git介绍 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 二.Git安装(Mac系统) 在Git官网下载安装包双击直接安装 在终端输入git来检测Git ...
- 【优质blog、网址】置顶
一.大公司等技术blog: blog1: http://blog.csdn.net/mfcing/article/details/51577173 blog2: http://blog.csdn. ...
- docker:相关命令
1.查看正在运行的容器 docker ps docker ps -a 查看所有的容器,包括已经停止了的 2.WORKDIR Dockerfile中的WORKDIR指令用于指定容器的一个目录,容器启动时 ...
- net 网站过滤器 mvc webapi
WebApi过滤器1 public class TestController : ApiController { /// <summary> /// 获取用户信息 /// </sum ...
- docker快速入门01——docker安装与简单应用
1.docker简介 Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...
- 关于 php for zookeeper
原文:Distributed application in PHP with Apache Zookeeper 地址:http://systemsarchitect.net/distributed-a ...
- [POJ1664]放苹果(动态规划)
[POJ1664]放苹果 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第 ...
- Vue基础第三章 - 计算属性
1.计算属性介绍 在第二章中我们介绍了在Vue的{{}}中可以使用一些简单的表达式进行计算,但是当表达式过长或者逻辑过于复杂就会变得不易理解和维护,比如第二章的示例{{ text.split(',') ...
- htmlunit与Jsoup
//这个函数的目的是在获取页面的同时,也获取链接对应的cookiepublic static HtmlPage getCookieAndHtml(String url)throws IOExcepti ...