HDU - 1520 Anniversary party (树的最大独立集)
Time limit :1000 ms ;Memory limit :32768 kB; OS :Windows
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
题意:给你一棵树,你从中选择若干结点,要求这些结点中任意两个不能有“父子”关系,求最后权值的最大值。
分析:这便是紫书上所说的“树的最大独立集”问题,这要是放在线性表上,直接用01背包就解决了,但树上的动态规划就是把这种简单操作放在树上解决,难度就增加了。解题步骤如下:
①用邻接表储存所给的树。
②因为每个点可取可不取,dp[i][0]表示第i个结点不选时的最大值,dp[i][1]表示第i个结点选时的最大值。状态转移方程为: dp[father][0] += max(dp[son][0],dp[son][1]);父亲没有被邀请 ,dp[father][1] += dp[son][0];父亲被邀请了,儿子不能被邀请。
③最终结果为max(dp[root][1],dp[root][0])。
AC代码如下(93ms):
#include <bits/stdc++.h>
using namespace std;
#define fast ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long
#define _for(i,a,b) for(int i = a;i < b;i++)
#define rep(i,a,b) for(int i = a;i <= b;i++)
#define all(s) s.begin(), s.end()
const int maxn = 6050;
int N;
bool no_root[maxn];//判断是不是树根
vector<int>G[maxn];//邻接表
int dp[maxn][2];//dp[i][0]表示以i为根的子树,不选i时的最大值
//dp[i][1]表示以i为根的子树,选i时的最大值
void dfs(int root)
{
int nson = G[root].size();
_for(i, 0, nson)
{
int son = G[root][i];
dfs(son);
dp[root][0] += max(dp[son][1], dp[son][0]);
dp[root][1] += dp[son][0];
}
}
int main()
{
while (scanf("%d", &N) == 1)
{
memset(no_root, 0, sizeof(no_root));
rep(i, 1, N)G[i].clear();//清空邻接表
rep(i, 1, N)
{
scanf("%d", &dp[i][1]);
dp[i][0] = 0;
}
int v, u;//员工与直属上级
while (scanf("%d%d", &v, &u) == 2 && v + u)//u是v的父结点
{
G[u].push_back(v);
no_root[v] = true;//v不是根
}
int ans = 0;
rep(i, 1, N)
{
if (no_root[i] == 0)//从根结点开始(注意,这里可能不止一个根)
{
dfs(i);
ans = max(ans, max(dp[i][0], dp[i][1]));
}
}
printf("%d\n", ans);
}
return 0;
}
HDU - 1520 Anniversary party (树的最大独立集)的更多相关文章
- 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 ...
- hdu 1520 Anniversary party(第一道树形dp)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...
- 题解报告:hdu 1520 Anniversary party(树形dp入门)
Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...
- hdu 1520 Anniversary party 基础树dp
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- HDU 1520.Anniversary party 基础的树形dp
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个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...
- hdu 1520 Anniversary party || codevs 1380 树形dp
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- [HDU 1520] Anniversary party
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- 【案例演示】JVM之强引用、软引用、弱引用、虚引用
1.背景 想要理解对象什么时候回收,就要理解到对象引用这个概念,于是有了下文 2.java中引用对象结构图 3.引用详解 3.1.什么是强引用 a.当内存不足,JVM开始垃圾回收,对于强引用的对象,就 ...
- vue入门的第一天: v-on使用
v-on的使用 简介: v-on 是一个事件绑定机制,可以缩写为@ 如: <input type="button" value="按钮" v-on:cli ...
- JDBC知识点总结
一:JDBC 概述 一.简介 1. JDBC(Java DataBase Connection,Java 数据库连接)是Java语言中用来规范客户端程序如何来访问数据库的应用程序 ...
- 明文暴露___JS前台加密,java后台解密实现
1.前台JS <script type="text/javascript"> $(function() { $("#btn").click(func ...
- JavaWeb网上图书商城完整项目--day02-2.regist页面输入框得到焦点隐藏label
实现当光标输入在输入输入框的时候,将后面的内容隐藏,例如在用户名称输入信息的时候,后面的用户名不能为空隐藏 我们来看看regist.js的代码: //该函数在html文档加载完成之后会调用 $(fun ...
- JavaWeb网上图书商城完整项目--27.注册页面之注册按钮图片切换实现
我们要实现立即注册这个按钮,光标获得焦点是一张图片,光标失去焦点的时候是另外一张图片 我们需要在文档加载完成之后,设置该事件hover事件 hover(over,out)这是jQuery的一个模仿悬停 ...
- java后台框架面试必须会的东西
- ubuntu无法安装vim、tree等解决办法
rm /etc/apt/sources.list.d/* 删除该目录下所有文件
- CSS如何将图像转换为模糊图像?
在CSS中,可以使用filter属性来模糊处理图像:filter属性用于将图像转换为模糊图像.该属性主要用于设置图像的视觉效果. 语法: filter: blur() 属性值: ● blur():给图 ...
- 【线型DP】CF1012C Hills 小山坡
来了来了. 题目: 给你n个数,你一次操作可以把某一个数-1(可以减为负数),你的目标是使任意的k个数严格小于它旁边的两个数(第一个数只用严格小于第二个数,第n个数只用严格小于第n-1个数),问最少需 ...