传送门:

http://acm.hdu.edu.cn/showproblem.php?pid=1520

Anniversary party

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16376    Accepted Submission(s): 6241

Problem Description
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
 
Source
 
Recommend
linle   |   We have carefully selected several similar problems for you:  1561 1011 2196 1494 2242 
 
题目大意:

学校要开一个聚会。学校的教职工之间有上下级关系,为了让所有人开心,宴会组织者决定不会同时邀请一个人和他的上级(这让我想起我们昨天晚上聚餐李晔老师不来,她怕她来了我们放不开。。。。),对于每一个人,他能给聚会带来的欢乐度有一个值,问组织者该邀请哪些人能够使宴会的欢乐度达到最大值。
解题思路:
首先是DP的部分(也是很无聊的一部分):每个参与者都有两种状态,一种是参加,一种是不参加。这个状态的后续影响就是如果他参加了,他的直接上司和直接下属都不能参加。我们可以用一个二维二态的数组来描述:dp[i][1]表示第i个参与者参加了,dp[i][0]表示第i个参与者没有参加。状态转移方程就是dp[i][1]=dp[i][1]+dp[i-1][0],dp[i][0]=dp[i][0]+Max(dp[i-1][0],dp[i-1][1])。
 
本质:将一个数字三角形的操作放在了树上
 
第一道树形dp题,纪念一下,虽然对树的部分理解的还不是很透彻
 
code:

#include <iostream>
#include <stdio.h>
#include<memory>
#include<stack>
#include<string.h>
#include<algorithm>
using namespace std;
#define max_v 6005
struct node
{
int pa,son;
int next;
} point[max_v]; int dp[max_v][];
//dp[i][1]表示第i个参与者参加了,dp[i][0]表示第i个参与者没有参加
//状态转移方程就:
//dp[i][1]=dp[i][1]+dp[i-1][0]
//dp[i][0]=dp[i][0]+Max(dp[i-1][0],dp[i-1][1]) int List[max_v]; int vis[max_v];//vis[a]=1 表示a有父节点 int value[max_v];//存值
int pos; void add(int pa,int son)
{
point[pos].pa=pa;
point[pos].son=son;
point[pos].next=List[pa];
List[pa]=pos++;
} void dfs(int root)
{
if(List[root]==-)//root没有子节点了
{
dp[root][]=value[root];
dp[root][]=;
return ;
} int now=List[root];
dp[root][]=;
dp[root][]=value[root]; while(now!=-)
{
dfs(point[now].son);
dp[root][]+=dp[point[now].son][];//既然取了父节点的值,子节点的值就不能再取了。 //父节点的值没有取,子节点的值分取和不取两种情况,取其中较大的那种情况。
dp[root][]+=max(dp[point[now].son][],dp[point[now].son][]); now=point[now].next;//这个子节点计算过了,就要开始计算下一个子节点了
}
return ;
} int main()
{
int n;
while(cin>>n)
{
for(int i=; i<=n; i++)
cin>>value[i];//记录每一个点的值 memset(List,-,sizeof(List));
memset(vis,,sizeof(vis)); int a,b;
pos=; while(~scanf("%d %d",&a,&b))
{
if(a==&&b==)
break;
add(b,a); //将边加入树中
vis[a]=; //记录a有父节点,不可能是祖节点。
} a=;
while(vis[a]==)
a++;//找到根结点 dfs(a);//从根结点开始搜 printf("%d\n",max(dp[a][],dp[a][]));//取最大
}
return ;
}
 
 

hdu 1520 Anniversary party(第一道树形dp)的更多相关文章

  1. TTTTTTTTTTT hdu 1520 Anniversary party 生日party 树形dp第一题

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

  2. HDU 1520.Anniversary party 基础的树形dp

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

  3. hdu 1520 Anniversary party || codevs 1380 树形dp

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

  4. hdu1520 第一道树形DP,激动哇咔咔!

    A - 树形dp Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  5. hdu 1561 The more, The Better(树形dp,基础)

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划)

    POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划) Descri ...

  7. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  8. HDU 1520 Anniversary party [树形DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...

  9. HDU 1520 Anniversary party(DFS或树形DP)

    Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...

随机推荐

  1. js 表格合并单元格

    5列  根据需要可添加 或 删除 strOneTemp  strTwoTemp  strThreeTemp  strFourTemp  strFiveTemp //合并单元格  this.mergeC ...

  2. 中南oj 1216: 异或最大值 数据结构

    1216: 异或最大值 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 98  Solved: 29 [Submit][Status][Web Boar ...

  3. js数组详解

        1,什么是数组 数组是值得有序集合,每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引.js的数组是无类型的,数组元素可以是任意类型,同一个数组中的不同元素可能是对象或数组 ...

  4. base64编码 的 图片 另存为下载

    功能描述: 有一段base64字符串的图片,将其保存下载为png图片! 可以:  直接 a 链接下载:  <a id="tttt" download="1.jpg& ...

  5. css伪元素详解

    css的伪元素,之所以被称为伪元素,是因为他们不是真正的页面元素,html没有对应的元素,但是其所有用法和表现行为与真正的页面元素一样,可以对其使用诸如页面元素一样的css样式,表面上看上去貌似是页面 ...

  6. 05_dubbo_aop

    [对这行代码进行源码分析] ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.c ...

  7. C# textBox限定输入数字

    private void tBox_KeyPress(object sender, KeyPressEventArgs e) { ; //禁止空格键 )) return; //处理负数 if (e.K ...

  8. linux 系统开机自启执行 操作的配置

    1 linux 服务注册 service文件 在service文件中设置变量和环境变量 [Unit] Description= #服务描述 After=syslog.target #服务启动依赖 [S ...

  9. php安装扩展redis淌过的坑

    php安装扩展redis淌过的坑 php扩展 redis cd /usr/local/src/ wget https://github.com/nicolasff/phpredis/archive/2 ...

  10. 设计模式:Builder模式

    设计模式:Builder模式 一.前言    今天我们讨论一下Builder建造者模式,这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之 ...