HDU 1520 & POJ 2342 Anniversary party(树形dp)

Anniversary party

Time Limit:1000MS     Memory Limit:65536KB     64bit
IO Format:
%I64d & %I64u

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 N – 1 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

题目大意:

题目大概说的是,一个公司要举行一个party ,让每个人参加的话就会增加一定的欢乐程度,为了排除尴尬的场面,每个人和他的直接领导不能同时来参加,给你一个 n ,说明有 n 个人,然后 接着 n 行 表示 让每个人去所增加的欢乐程度,接着每行输入两个说 l 和 k ,表示  k 是 l 的直属上司,直到输入为 0 0 时该组输入结束,输出所能达到的最大的欢乐值。

思路分析:

每个人能不能参加与他的直属上司参加不参加有关,如果他的上司参加了,那么他就不能参加,如果他的上司没参加,那么他可以参加也可以不参加,我们现在用 dp[i][0] 表示 i 不参加的欢乐值,dp[i][1] 表示 i 参加的欢乐值,那么我们可以推出一个状态转移方程

                        dp[k][1] += dp[l][0];
			dp[k][0] += max(dp[l][0],dp[l][1]);

因此,我们就可以用这个状态转移方程求解。

这道题出现了一个令我很无语的情况,那就是在 HDU oj 上  用 c++ 编译器能过,而用 G++ 编译器超时,所以大家提交的时候注意点

附上一些我找到的 c++ 与 g++ 的差别链接:http://blog.csdn.net/xia842655187/article/details/51329012点击打开链接

附上代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>
#define INF 0x3f3f3f3f

using namespace std;

int dp[6500][2];
int visit[6500],n,father[6500];

void dfs(int root)                           //  利用 深搜从根开始往下搜,搜到最后一层厚,慢慢的网上递推转移
{
	visit[root] = 1;
	for(int i = 1;i <= n;i++)
	{
		if(father[i] == root && !visit[i])        //   root 是 i 的上司,那么就对 i 作为一个新根进行往下搜索
		{
			dfs(i);
			dp[root][1] += dp[i][0];                 //  root 去的时候,i 肯定不能去,所以 加上 dp[i][0]
			dp[root][0] += max(dp[i][0],dp[i][1]);  //  root 不去的时候 从 i 去和不去中选一个最大值
		}
	}
}

int main()
{
	while(cin >> n)
	{
		memset(dp,0,sizeof(dp));
		for(int i = 1;i <= n;i++)
		{
			scanf("%d",&dp[i][1]);
		}
		fill(father,father + 6500,0);          //  将每个人的直属上司初始化为 0
		int l ,k,root = 0;
		while(cin >> l >> k && l + k)          //  对 每个人的直属上司进行标记
		{
			father[l] = k;
			root = k;
		}
		while(1)                               //  判断查询到树的根
		{
			if(father[root] == 0)
			break;
			root = father[root];
		}
		memset(visit,0,sizeof(visit));
		dfs(root);         //  从根开始查询
		cout << max(dp[root][0],dp[root][1]) << endl;        //  从 大 boss 去与不去中选择一个 欢乐值最大的输出
	}
	return 0;
}
时间: 2024-10-09 01:07:50

HDU 1520 & POJ 2342 Anniversary party(树形dp)的相关文章

POJ 2342 Anniversary party (树形dp 入门题)

Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4810   Accepted: 2724 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

POJ 2342 Anniversary party 树形dp入门

http://poj.org/problem?id=2342 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总活跃指数最大. 对于每一个人,都有两种情况,选,或者不选.然后选了后,他的下属就只能不选了,如果它不选,下属可能选或者不选. 这样用dfs + 记忆化搜索,就好了 每次搜索,就是要求以第cur个节点为根的子树中,其中第cur个节点的状态是s

POJ 2342 Anniversary party 树形DP基础题

题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人就不可以邀请其的直属员工, 问如何使得这个快乐值达到最大. 题解:对每个结点dp[i][0]表示不邀请这个员工,其子树达到的最大快乐值,dp[i][1]表示邀请i员工其子树达到的最大值. dp[i][0]=(i的全部员工的max(dp[u][1],dp[u][0)相加,也就是其子员工来或不来的最大快

POJ 2342 Anniversary Party ( 树形DP )

deque 的插入操作不一定有 vector 快 #include <iostream> #include <cstring> #include <fstream> #include <vector> using namespace std; #define NOT_SELECTED 0 #define SELECTED 1 #define SIZE 6001 vector< int > relations[SIZE]; bool visited

poj 2324 Anniversary party(树形DP)

/*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ---于是当i去时,i的所有儿子都不能去:dp[i][1]=sum(dp[j][0])+a[i],其中j是i的儿子节点. ---当i不去时,i的儿子可去也可不去:dp[i][0]=sum(max(dp[j][0],dp[j][1])),j是i的儿子节点 ---边界条件:当i时叶子节点时,dp[i][

POJ 2342 Anniversary party (树dp)

题目链接:http://poj.org/problem?id=2342 有n个人,每个人有活跃值.下面n-1行u和v表示u的上司是v,有直接上司和下属的关系不能同时参加party,问你party最大的活跃值是多少. 也就是说一棵树中,选择的点不能是相邻的点,且要使活跃值最大. 简单的树形dp,任意选一个点开始遍历,从叶子节点开始回溯. dp[i][0]表示不选i节点最大的活跃度,则dp[i][1]表示选i节点最大的活跃度. i与j相连,dp[i][0] += max(dp[j][0], dp[j

poj 2342 Anniversary party,树形DP easy

poj 2342 Anniversary party 没有上司的晚会 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会,要求与会职员的快乐指数最大.但是,没有职员愿和直接上司一起与会. 程序名:party 输入格式: 第一行一个整数N.(1<=N<=6000) 接下来N行,第i+1行表示i号职员的快乐指数Ri.(-128<=Ri<=127) 接下来N-1行,每行输入

hdu 1561The more, The Better(树形dp&amp;01背包)

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4949    Accepted Submission(s): 2918 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝

HDU 4008 Parent and son LCA+树形dp

题意: 给定case数 给定n个点的树,m个询问 下面n-1行给出树边 m个询问 x y 问:以x为根,y子树下 y的最小点标的儿子节点 和子孙节点 思路: 用son[u][0] 表示u的最小儿子 son[u][2] 表示u的次小儿子 son[u][1] 表示u的最小子孙 若lca(x,y)  !=y  则就是上述的答案 若lca(x,y) == y 1.y != 1 那么最小儿子就是除了x外的节点,且此时father[y] 也是y的儿子节点, 而最小的子孙节点就是1 2.y==1 那么特殊处理