原题地址: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)题解的更多相关文章

  1. Anniversary party(hdu1520)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. [poj2342]Anniversary party_树形dp

    Anniversary party poj-2342 题目大意:没有上司的舞会原题. 注释:n<=6000,-127<=val<=128. 想法:其实就是最大点独立集.我们介绍树形d ...

  3. HDU1520 Anniversary party —— 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  4. poj2342 Anniversary party (树形dp)

    poj2342 Anniversary party (树形dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9128   ...

  5. hdu1520 树形dp Anniversary party

    A - Anniversary party Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  6. 【poj2342】 Anniversary party

    http://poj.org/problem?id=2342 (题目链接) 题意 没有上司的舞会... Solution 树形dp入门题. dp[i][1]表示第i个节点的子树当节点i去时的最大值,d ...

  7. poj2342 Anniversary party

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8028   Accepted: 4594 ...

  8. HDU1520:Anniversary party(树形dp第一发)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1520 一个公司去参加宴会,要求去的人不能有直接领导关系,给出每一个人的欢乐值,和L K代表K是L的直接领导 ...

  9. HDU1520 Anniversary party 树形DP基础

    There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The Un ...

随机推荐

  1. Docker 运行 MySQL,使用 docker-compose

    目录结构 . │ .env │ docker-compose.yml │ └─mysql ├─config │ my.cnf │ └─data mysql 目录下的 data 为数据目录,mysql ...

  2. 解决Linq Join Group by 时报错:Nullable object must have a value.

    Linq Join Group by 时报Nullable object must have a value. 例如: from s in subject on ch.SubId equals s.S ...

  3. 【转载】C#通过Rows.Count属性获取总行数

    在C#中的Datatable数据变量的操作过程中,有时候我们需要知道DataTable中是否含有数据行或者DataTable的数据总行数,此时我们就可以先拿到DataTable中的Rows属性对象,通 ...

  4. vue-awesome-swiper兼容ie9

    轮播插件vue-awesome-swiper在ie9中运行的时候没效果 解决方法: vue-awesome-swiper在IE9下报错, 主要原因是element.classlist.add()方法在 ...

  5. 【案例】保健品行业如何优化供应链管理?APS系统来帮忙

    仙乐健康一直致力于为了客户提供世界级的产品及服务,随着业务量的不断扩大,公司先后实施了ERP系统,CRM系统,WMS系统,OA系统,朝着行业信息化水平领先的目标迈进. 但近年仅仅拥有传统ERP系统和手 ...

  6. React 之 Redux 的使用

    Redux可以简单概况为:将需要修改的state都存入到store里,发起一个action用来描述发生了什么,用reducers描述action如何改变state tree .创建store的时候需要 ...

  7. JVM 源码解读之 CMS 何时会进行 Full GC

    t点击上方"涤生的博客",关注我 转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注. 前言 本文内容是基于 JDK 8 在文章 JVM 源码解读之 CMS GC 触 ...

  8. php根据二维数组中的某一元素相等,另一个元素相加

    二维数组:$taskData Array ( [0] => Array ( [area] => 1 [winsFlag] => 7 [count] => 3 ) [1] =&g ...

  9. SQLAlchemy的常用数据类型

    SQLAlchemy常用的数据类型 Column 代表数据库表中的一列 是创建对象时数据类型所依赖的对象,通过在Column对象中指明具体的数据类型来实现相应的数据库表中的列的格式自定义. Strin ...

  10. Django之auth认证

    Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的 ...