Anniversary party(hdu1520)(poj2342)题解
原题地址:http://poj.org/problem?id=2342
题目大意:
上司和下属不能同时参加派对,求参加派对的最大活跃值。
关系满足一棵树,每个人都有自己的活跃值(-128~127)
求最大的活跃度。
树形DP入门题。
首先讲解一下树形DP,顾名思义,树形DP一定是在树上的DP,与普通的DP相似,具有两个方向。
1.根---->叶
2.叶---->根
其中第二种最为常用。实现方法:从根节点开始DFS(深度优先搜索),一直搜索到叶节点,然后根据其特殊性质赋值。通过回溯更新到根节点。得出答案。
回过来说这道题。
首先是状态。
这道题的DP状态共两维,第一维表示自己本身编号,第二维表示去或者不去。
即dp[i][j] j的取值为0或1,1表示去,0表示不去。
最后的答案即为根节点的状态max(dp[root][0],dp[root][1]);
首先常规操作,建边,找根节点。有向图,我们可以通过统计入度和出度来判断根节点和叶节点。
接下来是状态转移方程:
dp[x][1]+=dp[to][0];
dp[x][0]+=max(dp[to][0],dp[to][1]);
很好理解,x是上司,to是下属,通过下属来更新上司。
一个上司可能有多个下属,但是这些下属只能有一个上司,符合树的定义。
如果这个上司去,那么下属只能不去,所以要加上所有的下属不去的状态。即dp[to][0]
如果上司不去,这个时候需要比较下属去或者不去的大小。
有的同学可能会问了,为什么不直接让下属去多好啊,一步贪心,相当于把树进行了黑白染色,要么黑的去,要么白的去,比较一下大小不就好了?
我刚开始纠结了半天,后来发现了题中所给的条件。
关系满足一棵树,每个人都有自己的活跃值(-128~127)。
由于有些员工过于矫情,去派对自己还不活跃,所以之前的贪心是错误的。
之后比较老总(根节点)去或者不去的大小,选择较大值。
上代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int val[];
int indegree[];
int outdegree[];
struct edge
{
int to;
int nxt;
}eg[];
int head[];
int cnt = ;
void add(int x,int y)
{
eg[cnt].to = y;
eg[cnt].nxt = head[x];
head[x] = cnt++;
}
int dp[][];
void dfs(int x)
{
if(outdegree[x]==)
{
dp[x][] = val[x];
return ;
}
for(int i = head[x];i;i=eg[i].nxt)
{
int to = eg[i].to;
dfs(to);
dp[x][]+=dp[to][];
dp[x][]+=max(dp[to][],dp[to][]);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i = ;i<=n;i++)
{
scanf("%d",&val[i]);
dp[i][] = val[i];
}
for(int i = ;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x==&&y==)
{
break;
}
indegree[x]++;
outdegree[y]++;
add(y,x);
}
int root;
for(int i = ;i<=n;i++)
{
if(indegree[i]==)
{
root = i;
}
}
dfs(root);
printf("%d",max(dp[root][],dp[root][]));
}
Anniversary party(hdu1520)(poj2342)题解的更多相关文章
- Anniversary party(hdu1520)
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- [poj2342]Anniversary party_树形dp
Anniversary party poj-2342 题目大意:没有上司的舞会原题. 注释:n<=6000,-127<=val<=128. 想法:其实就是最大点独立集.我们介绍树形d ...
- HDU1520 Anniversary party —— 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...
- poj2342 Anniversary party (树形dp)
poj2342 Anniversary party (树形dp) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9128 ...
- hdu1520 树形dp Anniversary party
A - Anniversary party Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- 【poj2342】 Anniversary party
http://poj.org/problem?id=2342 (题目链接) 题意 没有上司的舞会... Solution 树形dp入门题. dp[i][1]表示第i个节点的子树当节点i去时的最大值,d ...
- poj2342 Anniversary party
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8028 Accepted: 4594 ...
- HDU1520:Anniversary party(树形dp第一发)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1520 一个公司去参加宴会,要求去的人不能有直接领导关系,给出每一个人的欢乐值,和L K代表K是L的直接领导 ...
- HDU1520 Anniversary party 树形DP基础
There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The Un ...
随机推荐
- 基于已有集群动态发现方式部署 Etcd 集群
etcd提供了多种部署集群的方式,在「通过静态发现方式部署etcd集群」 一文中我们介绍了如何通过静态发现方式部署集群. 不过很多时候,你只知道你要搭建一个多大(包含多少节点)的集群,但是并不能事先知 ...
- Docker 运行 MySQL,使用 docker-compose
目录结构 . │ .env │ docker-compose.yml │ └─mysql ├─config │ my.cnf │ └─data mysql 目录下的 data 为数据目录,mysql ...
- <!DOCTYPE html> 详解
前段时间的.netcore web应用程序的项目里面使用Frameset与Frame时候出现了一个问题就是使用不了,今晚准备测试一个bug却得到意外收获o(∩_∩)o 哈哈, 找到了最终原因funny ...
- C#读写修改设置调整UVC摄像头画面-清晰度
有时,我们需要在C#代码中对摄像头的清晰度进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄 ...
- 经实验验证,修正对using namespace std的认识
备注①:name:符号.指的实体包括:变量.函数.类 备注②:认为全局命名空间也是一个包,在此称作 ROOT:: 或 global:: (这样就有了两个特别的包:一个是全局包,一个是std包.但对于编 ...
- js/jquery键盘事件及keycode大全
js/jquery的键盘事件分为keypress.keydown和keyup事件 一.键盘事件 1.keydown()事件当按钮被按下时,发生 keydown 事件. 2.keypress()事件ke ...
- Java自学-类和对象 类方法
Java的类方法和对象方法 类方法: 又叫做静态方法 对象方法: 又叫实例方法,非静态方法 访问一个对象方法,必须建立在有一个对象的前提的基础上 访问类方法,不需要对象的存在,直接就访问 步骤 1 : ...
- tomcat重启session不失效问题
本地写代码每次重启都要重新登录浪费了很多时间,如何重启不用重新登录呢,只要让tomcat在关闭时将session写入文件中,在启动时从文件中读取session即可. 只需在conf/context.x ...
- ECMA6新增语法(待续...)
块级作用域: ES6允许你使用块级作用域,不过目前大多数的ES6语法只允许在严格模式下使用("use strict” ). 1 let关键字 作用:声明变量,一个花括号就是一个作用域(每个 ...
- 数据结构与算法5—KMP算法
串的模式匹配算法 子串(模式串)的定位操作通常称为串的模式匹配. 这是串的一种重要操作,很多 软件,若有“编辑”菜单项的话, 则其中必有“查找”子菜单项. 串的顺序存储实现 #include<s ...