一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加。

要求:

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 水题的更多相关文章

  1. HDU 1520 Anniversary party [树形DP]

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

  2. poj 2342 hdu 1520【树形dp】

    poj 2342 给出每个顶点的happy值,还有若干组两个顶点L,K关系,表示K是L的上司.求当K.L不同时出现时获得的happy值的最大和. 设dp[u][0]表示不选u结点时获得的最大值,dp[ ...

  3. 树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]

    题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 ...

  4. 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 ...

  5. POJ 2342 Anniversary party 树形DP基础题

    题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...

  6. hdu oj 1520 Anniversary party(树形dp入门)

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

  7. 树形DP水题杂记

    BZOJ1131: [POI2008]Sta 题意:给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大. 题解:记录每个点的深度,再根据根节点的深度和逐层推导出其他点的深度和. ...

  8. 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 ...

  9. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

随机推荐

  1. 50个C/C++源代码网站(转-清风小阁)

    C/C++是最主要的编程语言.这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码 .主要转贴: http://blog.csdn.net/nuoshueihe/article/detai ...

  2. breakpoints

    https://blogs.msdn.microsoft.com/visualstudioalm/2013/10/07/breakpoints-in-visual-studio-2013/ Using ...

  3. 矩阵的QR分解(三种方法)Python实现

    1.Gram-Schmidt正交化 假设原来的矩阵为[a,b],a,b为线性无关的二维向量,下面我们通过Gram-Schmidt正交化使得矩阵A为标准正交矩阵: 假设正交化后的矩阵为Q=[A,B],我 ...

  4. ID3算法 决策树的生成(1)

    # coding:utf-8 import matplotlib.pyplot as plt import numpy as np import pylab def createDataSet(): ...

  5. Choosing proper innodb_log_file_size

    If you’re doing significant amount of writes to Innodb tables decent size of innodb_log_file_size is ...

  6. BI案例:KPI在商业智能中的应用(ZT)

    KPI(Key Performance Indication)即关键业绩指标,是通过对组织内部某一流程的输入端.输出端的关键参数进行设置.取样.计算.分析,衡量流程绩效的一种目标式量化管理指标,是把企 ...

  7. .NET_RSA加密全接触(重、难点解析)

    .NET_RSA加密全接触(重.难点解析) .NET Framework提供了两个类供我们使用RSA算法,分别是:用于加密数据的RSACryptoServiceProvider和用于数字签名的DSAC ...

  8. Python基础(二) —— 字符串、列表、字典等常用操作

    一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 二.三元运算 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为 ...

  9. WPF拖到、移动控件

    只需2个事件和一个point变量即可: Point mouse_offset = , ); void TC_MouseLeftButtonDown(object sender, MouseButton ...

  10. LintCode "Coins in a Line"

    Recursion + Memorized Search(DP). And apparently, the code below can be iterative with only 3 vars - ...