URAL-1039 Anniversary Party---树形DP入门题
题目链接:
https://cn.vjudge.net/problem/URAL-1039
题目大意:
开一个party,每个员工都有一个欢乐值,只有是上司和下属不同时存在时才能欢乐,问怎样安排能有最大的欢乐值。
解题思路:
首先建立上司下属的树形结构,进行树形DP
dp[i][0]表示第i人不参加聚会时,以i为根节点的子树的最大欢乐值
dp[i][1]表示第i人参加聚会时,以i为根节点的子树的最大欢乐值
答案就为max(dp[root][0], dp[root][1])
根据边找到root节点
递推方程:
dp[i][0] = sum(max(dp[son][0], dp[son][1]))第i节点不去,它的儿子可以去,也可以不去
dp[i][1] = a[x] + sum(dp[son][0]) i节点去,那么它的儿子一定不可以去
用dfs来更新dp
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + ;
vector<int>Map[maxn];
int dp[maxn][], a[maxn], father[maxn];
void dfs(int x)
{
dp[x][] = a[x];
for(int i = ; i < Map[x].size(); i++)
{
int son = Map[x][i];
dfs(son);
dp[x][] = max(dp[x][] + dp[son][], dp[x][] + dp[son][]);
dp[x][] = dp[x][] + dp[son][];
}
//cout<<x<<dp[x][0]<<dp[x][1]<<endl;
}
int main()
{
int n;
while(cin >> n)
{
memset(dp, , sizeof(dp));
for(int i = ; i <= n; i++)
{
scanf("%d", &a[i]);
father[i] = -;
Map[i].clear();
}
int u, v;
while(scanf("%d%d", &u, &v) != EOF)
{
if(!u && !v)break;
Map[v].push_back(u);
father[u] = v;
}
int root = ;
while(father[root] != -)
{
root = father[root];
}
dfs(root);
cout<<max(dp[root][], dp[root][])<<endl;
}
return ;
}
URAL-1039 Anniversary Party---树形DP入门题的更多相关文章
- (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520
题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- [poj2342]Anniversary party树形dp入门
题意:选出不含直接上下司关系的最大价值. 解题关键:树形dp入门题,注意怎么找出根节点,运用了并查集的思想. 转移方程:dp[i][1]+=dp[j][0];/i是j的子树 dp[i][0]+=max ...
- hdu_Anniversary party_(树形DP入门题)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...
- HDU - 1520 树形DP入门题
写了两种DP,第一种是按照自己习惯来xjb敲的,第二种参考别人 熟悉一下树形DP的套路 dp[i][]是维护i及以下的关系最优值的,所以我觉得两次DP记忆搜索之间不清-1应该是正确的(也就做了一次加法 ...
- hdu oj 1520 Anniversary party(树形dp入门)
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- poj 2342 Anniversary party 树形DP入门
题目链接:http://poj.org/problem?id=2342 题意:一家公司有1 <= N <= 6 000个职工,现要组织一些职工参加晚会,要求每个职工和其顶头上司不能同时参加 ...
- POJ 2342 Anniversary party 树形DP基础题
题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...
随机推荐
- Orchard源码:缓存设计
概述 从缓存失效的几种方式开始了解Orchard缓存设计 1.设置失效时间 Func<int> retrieve = () => _cacheManager.Get("te ...
- MySQL---3、常用命令大全
一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -ur ...
- golang学习之slice基本操作
slice的增删改查: //删除 func remove(slice []interface{}, i int) []interface{} { // copy(slice[i:], slice[i+ ...
- 【7】.net WebAPI Owin OAuth 2.0 密码模式验证实例
1.OAuth密码模式 2.在VS中创建WebAPI项目 在nuget中安装: Microsoft.AspNet.WebApi.Owin Microsoft.Owin.Host.SystemWeb 这 ...
- JAVA注释方式
1.单行(single-line)注释 //…… 2.块(block)注释 /*……*/ 3.文档注释 /**……*/
- 【转载】Spring Cloud底层原理
概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...
- 最小生成树(prim)
里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且 ...
- JS 处理浮点型问题
function disposeNumber(value){ if(value == null || value == ""){ return 0; }else if(value. ...
- 为什么排版引擎解析 CSS 选择器时一定要从右往左解析?
首先我们要看一下选择器的「解析」是在何时进行的. 主要参考这篇「 How browsers work」(http://taligarsiel.com/Projects/howbrowserswork1 ...
- 使用laravel框架与phantomjs实现截屏功能
在网上看到的关于phantomjs实现截屏功能很多都是与node结合在一起使用,并需要输入命令才能执行.因此我想要实现输入网址即可截屏并输出图片的功能.示例:http://120.77.171.182 ...