题目链接http://poj.org/problem?id=2342

题目大意:直属上司和下属出席聚会。下属的上司出现了,下属就不能参加,反之下属参加。注意上司只是指直属的上司。每个人出席的人都有一个快乐值,问最大的快乐值是多少。

解题思路

首先确定一下顶头上司是谁。

f[v]=u表示u是v的父亲,这样addedge完了之后,从1开始while(f[root]) root=f[root],最后root就是顶头上司,也就是dfs的起点了。

用dp[i][0]表示对于第i个人不出席的最大快乐值,用dp[i][1]表示出席的最大快乐值。

则dp[i][0]=dp[i][0]+max(dp[son][0],dp[son][1]) ,原因是上司不出席,下属可出席也可不出席,取个大的。

dp[i][1]=dp[i][1]+dp[son][0],原因是上司一旦出席,下属绝对不能出席。

其中dp[i][1]的初始值为这个人的快乐值。

则ans=max(dp[root][0],dp[root][1])

注意本题的dfs只是起到推进树结构作用,推完树结构之后,还是传统的DP转移方式,不是记忆化搜索。

#include "cstdio"
#include "vector"
#include "cstring"
using namespace std;
#define maxn 6005
int hap[maxn],f[maxn],dp[maxn][],head[maxn],tol;
struct Edge
{
int to,next;
}e[maxn];
void addedge(int u,int v)
{
e[tol].to=v;
e[tol].next=head[u];
head[u]=tol++;
}
void dfs(int root)
{
dp[root][]=hap[root];
for(int i=head[root];i!=-;i=e[i].next) dfs(e[i].to);
for(int i=head[root];i!=-;i=e[i].next)
{
dp[root][]+=max(dp[e[i].to][],dp[e[i].to][]);
dp[root][]+=dp[e[i].to][];
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n,u,v;
while(~scanf("%d",&n)&&n)
{
memset(f,,sizeof(f));
memset(dp,,sizeof(dp));
memset(head,-,sizeof(head));
for(int i=; i<=n; i++) scanf("%d",&hap[i]);
for(int i=; i<=n; i++)
{
scanf("%d%d",&v,&u);
if(u==&&v==) break;
f[v]=u;
addedge(u,v);
}
int root=;tol=;
while(f[root]) root=f[root];
dfs(root);
int res=max(dp[root][],dp[root][]);
printf("%d\n",res);
}
}
13547096 neopenx 2342 Accepted 408K 0MS C++ 1182B 2014-10-20 12:18:43

POJ 2342 (树形DP)的更多相关文章

  1. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  2. poj 2342树形dp板子题1

    http://poj.org/problem?id=2342 #include<iostream> #include<cstdio> #include<cstring&g ...

  3. Anniversary party(POJ 2342 树形DP)

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5767   Accepted: 3335 ...

  4. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  5. poj 1463(树形dp)

    题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...

  6. poj 2486( 树形dp)

    题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...

  7. poj 3140(树形dp)

    题目链接:http://poj.org/problem?id=3140 思路:简单树形dp题,dp[u]表示以u为根的子树的人数和. #include<iostream> #include ...

  8. Strategic game(POJ 1463 树形DP)

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 7490   Accepted: 3483 De ...

  9. poj 3345 树形DP 附属关系+输入输出(好题)

    题目连接:http://acm.hust.edu.cn/vjudge/problem/17665 参考资料:http://blog.csdn.net/woshi250hua/article/detai ...

随机推荐

  1. 新鲜出炉的百度js面试题

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 最近两位同学入职百度,带回来的笔试题基本上毫无悬念,不过有一个小题看到让人忍不住笑出声来,真的很无聊 ...

  2. Phpstorm常用设置

    Phpstorm更换主题和字体 1.File -- settings -- Editor -- Colors And Fonts: 2.在右侧窗口中选择Scheme name : 选择一个自己喜欢的主 ...

  3. 题目1006:ZOJ问题

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:13212 解决:2214 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. 是否AC的规则如下:1. ...

  4. 用几条shell命令快速去重10G数据

    试想一下,如果有10G数据,或者更多:怎么才能够快速地去重呢?你会说将数据导入到数据库(mysql等)进行去重,或者用java写个程序进行去重,或者用Hadoop进行处理.如果是大量的数据要写入数据库 ...

  5. 那些臭名昭著的sql

    两个或多个表关联,没写where条件,大量的笛卡尔值,严重时会导致数据库有问题. select * from a, b left join c on b.id = c.id left join d o ...

  6. 手动构建Servlet项目的流程

    前面讨论过手动建立jsp的项目,jsp是tomcat服务器负责编译执行,所以配置相对简单,而Servlet需要先把java源文件编译成字节码class文件,然后再执行,所以需要servlet-api. ...

  7. 12.python笔记之mysqldb模块

    一.使用python调用模块操作MYsql 2.x版本使用mysqldb模块 3.x版本使用pymysql模块 1.数据库常用操作: 使用Navicat for MySql软件来操作 show dat ...

  8. ext上传文件到mysql上

    不废话,上代码: controller如下: /** * 上传附件 * @param request * @param baseBlob * @param response */ @RequestMa ...

  9. NEFU 2016省赛演练一 F题 (高精度加法)

    Function1 Problem:F Time Limit:1000ms Memory Limit:65535K Description You know that huicpc0838 has b ...

  10. C++C++中构造函数与析构函数的调用顺序

    http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...