POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加。
要求:
1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点)都不能被邀请
2.每一个员工都有一个兴奋值,在满足1的条件下,要使得邀请来的员工的兴奋值最高
输出最高的兴奋值。
简单的树形DP
dp[i][1]:表示以i为根的子树,邀请节点i的最大兴奋值
dp[i][0]:表示以i为根的子树,不邀请节点i的最大兴奋值
先根据入度找出整棵树的根节点,
然后一次DFS即可。
poj提交代码:
#include<cstdio>
#include<cstring> using namespace std; const int maxn=;
const int inf=0x3f3f3f3f; inline int max(int x,int y)
{
return x>y?x:y;
} int dp[maxn][];
int in[maxn];
int rate[maxn];
struct Edge
{
int to,next;
};
Edge edge[maxn];
int head[maxn];
int tot; void init()
{
memset(head,-,sizeof head);
tot=;
memset(in,,sizeof in);
} void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
} void dfs(int u,int pre); int main()
{
int n;
while(~scanf("%d",&n))
{
init();
scanf("%d",&rate[]);
if(!n&&!rate[])
break;
for(int i=;i<=n;i++)
{
scanf("%d",&rate[i]);
}
for(int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&v,&u);
addedge(u,v);
in[v]++;
}
int root;
for(int i=;i<=n;i++)
{
if(!in[i])
{
root=i;
break;
}
}
dfs(root,-);
printf("%d\n",max(dp[root][],dp[root][]));
}
return ;
} void dfs(int u,int pre)
{
dp[u][]=rate[u];
dp[u][]=;
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(v==pre)
continue;
dfs(v,u);
dp[u][]+=dp[v][];
dp[u][]+=max(dp[v][],dp[v][]);
}
}
HDU的1520和POJ的2342是一样的,但是输入有点不同
hdu提交代码:
#include<cstdio>
#include<cstring> using namespace std; const int maxn=;
const int inf=0x3f3f3f3f; inline int max(int x,int y)
{
return x>y?x:y;
} int dp[maxn][];
int in[maxn];
int rate[maxn];
struct Edge
{
int to,next;
};
Edge edge[maxn];
int head[maxn];
int tot; void init()
{
memset(head,-,sizeof head);
tot=;
memset(in,,sizeof in);
} void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
} void dfs(int u,int pre); int main()
{
int n;
while(~scanf("%d",&n))
{
init();
for(int i=;i<=n;i++)
{
scanf("%d",&rate[i]);
}
while(true)
{
int u,v;
scanf("%d%d",&v,&u);
if(!u&&!v)
break;
addedge(u,v);
in[v]++;
}
int root;
for(int i=;i<=n;i++)
{
if(!in[i])
{
root=i;
break;
}
}
dfs(root,-);
printf("%d\n",max(dp[root][],dp[root][]));
}
return ;
} void dfs(int u,int pre)
{
dp[u][]=rate[u];
dp[u][]=;
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(v==pre)
continue;
dfs(v,u);
dp[u][]+=dp[v][];
dp[u][]+=max(dp[v][],dp[v][]);
}
}
POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题的更多相关文章
- HDU 1520 Anniversary party [树形DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...
- poj 2342 hdu 1520【树形dp】
poj 2342 给出每个顶点的happy值,还有若干组两个顶点L,K关系,表示K是L的上司.求当K.L不同时出现时获得的happy值的最大和. 设dp[u][0]表示不选u结点时获得的最大值,dp[ ...
- 树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]
题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 ...
- poj 2342 && hdu 1520 树形dp
题意:有n个人,接下来n行是n个人的价值,再接下来n行给出l,k说的是l的上司是k,这里注意l与k是不能同时出现的 链接:点我 dp[i][1] += dp[j][0], dp[i][0] += ma ...
- POJ 2342 Anniversary party 树形DP基础题
题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...
- hdu oj 1520 Anniversary party(树形dp入门)
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 树形DP水题杂记
BZOJ1131: [POI2008]Sta 题意:给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大. 题解:记录每个点的深度,再根据根节点的深度和逐层推导出其他点的深度和. ...
- 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 ...
- (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520
题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...
随机推荐
- 《灰帽Python-黑客和逆向工程师的Python编程》学习记录
ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数. 操作环境:CentOS6.5 Python版本:2.66 ctypes是强大的,强大到本书 ...
- C++虚函数、赋值兼容原则
#include <iostream.h> class A { public: void f1() { cout << "a" << endl; ...
- spring源码学习之:spring容器的applicationContext启动过程
Spring 容器像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式进行工作.如果我们将Spring容器比喻为一辆汽车,可以将 BeanFactory看成汽车的发动机, ...
- curl网站开发指南
我一向以为,curl只是一个编程用的函数库. 最近才发现,这个命令本身,就是一个无比有用的网站开发工具,请看我整理的它的用法. =================================== ...
- excel动态去重和动态排序
其实去重和排序的方法很多,没有哪一种更好,实时去重总会省一些时间,刚好也练习了下数组公式 动态去重: =IF(ROW()<=COUNTA(员工基础数据!H:H),INDEX(员工基础数据!H:H ...
- Java static block static constructor , static field
http://stackoverflow.com/questions/7121213/singleton-instantiation http://docs.oracle.com/javase/spe ...
- Python面向对象编程——引言
1.类和实例:类是对象的定义,而实例是真正的事物.他存放了类中所定义的对象的具体信息 关键字是class,后面紧跟着一个类名,随后是定义类的雷替代码.通常有各种各样的定义和声明组成. class ...
- python数据库连接池
python数据库连接池 import psycopg2 import psycopg2.pool dbpool=psycopg2.pool.PersistentConnectionPool(1,1, ...
- Js中的window.parent ,window.top,window.self ,window.openner详解
在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法 ...
- SQL Server中数据库文件的存放方式,文件和文件组
原文地址:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html SQL Server中数据库文件的存放方式,文件和文件组 ...