Anniversary party (树形DP)
There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyakov. In order to make the party funny for every one, the rector does not want both an employee and his or her immediate supervisor to be present. The personnel office has evaluated conviviality of each employee, so everyone has some number (rating) attached to him or her. Your task is to make a list of guests with the maximal possible sum of guests' conviviality ratings.
Input
Employees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go T lines that describe a supervisor relation tree. Each line of the tree specification has the form:
L K
It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line
0 0
Output
Output should contain the maximal sum of guests' ratings.
Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
Sample Output
5
题解:这个题意是要举行晚会,每个人邀请了1——N个人,然后,每个人都有一个愉快值,但是如果每个人如果他的直接上司在他就会不开心,既然有等级关系,我们可以建立一棵树,然后对这棵树进行比较,通过dfs遍历,我们可以把在当前深度和他的上司深度进行比较,择优选择较大,这是一个dp的过程并且是在树上的操作,故可以用树形dp来解。,然后存图问题需要考虑,
下面给出两种代码,一种过poj,过不了hdu,另一种可过hdu
代码:
过POJ:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int pre[6005],vis[6005],n,dp[6005][2],s[6005];
void dfs(int a)
{
vis[a]=1;
for(int i=1; i<=n; i++)
{
if(vis[i]==0&&pre[i]==a)
{
dfs(i);
dp[a][0]+=max(dp[i][0],dp[i][1]);
dp[a][1]+=dp[i][0];
}
}
return;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int a,b;
memset(vis,0,sizeof(vis));
memset(s,0,sizeof(s));
for(int t=1; t<=n; t++)
{
scanf("%d",&dp[t][1]);
dp[t][0]=0;
}
while(scanf("%d%d",&a,&b))
{
if(a==0||b==0)//注意是||,不然会TLE
break;
pre[a]=b;
s[a]=1;
}
for(int t=1; t<=n; t++)
if(!s[t])
{
a=t;
}
dfs(a);
printf("%d\n",max(dp[a][0],dp[a][1]));
}
return 0;
}
可过HDU
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>v[6005];
int pre[6005];
int s[6005];
int dp[6005][2];
void dfs(int root)
{
int len=v[root].size();
dp[root][1]=s[root];
for(int i=0;i<len;i++)
dfs(v[root][i]);
for(int i=0;i<len;i++)
{
dp[root][0]+=max(dp[v[root][i]][1],dp[v[root][i]][0]);
dp[root][1]+=dp[v[root][i]][0];
}
}
int main()
{
int n;
int a,b;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
v[i].clear();
pre[i]=-1;//对树根标记
dp[i][0]=dp[i][1]=0;
}
while(scanf("%d%d",&a,&b))
{
if(a==0&&b==0)break;
pre[a]=b;
v[b].push_back(a);
}
a=1;
while(pre[a]!=-1)
a=pre[a];//找树根
dfs(a);
printf("%d\n",max(dp[a][1],dp[a][0]));
}
return 0;
}
Anniversary party (树形DP)的更多相关文章
- poj 2324 Anniversary party(树形DP)
/*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ...
- [poj2342]Anniversary party_树形dp
Anniversary party poj-2342 题目大意:没有上司的舞会原题. 注释:n<=6000,-127<=val<=128. 想法:其实就是最大点独立集.我们介绍树形d ...
- POJ 2342 - Anniversary party - [树形DP]
题目链接:http://poj.org/problem?id=2342 Description There is going to be a party to celebrate the 80-th ...
- hdu Anniversary party 树形DP,点带有值。求MAX
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...
- HDU 1520 Anniversary party [树形DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...
- POJ Anniversary party 树形DP
/* 树形dp: 给一颗树,要求一组节点,节点之间没有父子关系,并且使得所有的节点的权值和最大 对于每一个节点,我们有两种状态 dp[i][0]表示不选择节点i,以节点i为根的子树所能形成的节点集所能 ...
- [poj2342]Anniversary party树形dp入门
题意:选出不含直接上下司关系的最大价值. 解题关键:树形dp入门题,注意怎么找出根节点,运用了并查集的思想. 转移方程:dp[i][1]+=dp[j][0];/i是j的子树 dp[i][0]+=max ...
- Anniversary party_树形DP
Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State Univer ...
- HDU1520 Anniversary party 树形DP基础
There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The Un ...
随机推荐
- L1-039 古风排版(20 分)
中国的古人写文字,是从右向左竖向排版的.本题就请你编写程序,把一段文字按古风排版. 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数.第二行给出一个长度不超过1000的非空 ...
- bzoj 2733 永无乡 线段树
题目: 支持两种操作: 合并两点所在的联通块 查询某点所在联通块内权值第k小. 题解 平衡树启发式合并随便搞一搞就好了. 我写了一个线段树合并 #include <cstdio> #inc ...
- POJ1958:Strange Towers of Hanoi
我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://poj.org/problem?id=1958 题目要我们求四柱 ...
- bzoj 4823 & 洛谷 P3756 老C的方块 —— 最小割
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 https://www.luogu.org/problemnew/show/P3756 ...
- 【jQuery】praseFloat()方法的用法及注意事项
[jQuery]praseFloat()方法的用法及注意事项 praseFloat(): 用于解析一个字符串,并返回一个浮点数 语法: praseFloat(strin ...
- Qt webview调用JavaScript 带参函数
void MainWindow::on_pushButtonShowMarker_clicked() { QString lat = "104.701681"; QString l ...
- ES6之箭头函数中的this
在讲箭头函数中的this之前我们先介绍一下普通函数中的this. 普通函数中的this: (1)this指向它的直接调用者 (2)默认的,非严格模式下,没找到直接调用者则指向window ( ...
- Eclipse中插件的使用:maven /ant /tomcat
一:使用Eclipse构建Maven项目 http://blog.csdn.net/jackgaolei/article/details/11332249 二:Maven介绍,包括作用.核心概念.用法 ...
- 华为USG6320做双线-基于源地址的策略路由
通过配置策略路由实现不同源地址数据通过不同的链路转发. 组网需求 某企业公司拉了两条电信的光纤,分别为静态光纤和拨号光纤,前者主要用于服务器,后者则用于一般办公. 需求如下: 静态光纤:服务器专用 拨 ...
- css中的定位属性position(转)
css中的定位属性position 同样的也是上课的时候发现学生难以理解的一些问题拿出来记录一下,希望帮助初学者. 在css中定位属性position的运用在页面中是很常用的,特别是一些结合js来 ...