原题地址:http://poj.org/problem?id=2342

题目大意:

  上司和下属不能同时参加派对,求参加派对的最大活跃值。

  关系满足一棵树,每个人都有自己的活跃值(-128~127)

  求最大的活跃度。


树形DP入门题。

首先讲解一下树形DP,顾名思义,树形DP一定是在树上的DP,与普通的DP相似,具有两个方向。

1.根---->叶

2.叶---->根

其中第二种最为常用。实现方法:从根节点开始DFS(深度优先搜索),一直搜索到叶节点,然后根据其特殊性质赋值。通过回溯更新到根节点。得出答案。

回过来说这道题。

首先是状态。

这道题的DP状态共两维,第一维表示自己本身编号,第二维表示去或者不去。

即dp[i][j] j的取值为0或1,1表示去,0表示不去。

最后的答案即为根节点的状态max(dp[root][0],dp[root][1]);

首先常规操作,建边,找根节点。有向图,我们可以通过统计入度和出度来判断根节点和叶节点。

接下来是状态转移方程:

dp[x][1]+=dp[to][0];
dp[x][0]+=max(dp[to][0],dp[to][1]);

很好理解,x是上司,to是下属,通过下属来更新上司。

一个上司可能有多个下属,但是这些下属只能有一个上司,符合树的定义。

如果这个上司去,那么下属只能不去,所以要加上所有的下属不去的状态。即dp[to][0]

如果上司不去,这个时候需要比较下属去或者不去的大小。

有的同学可能会问了,为什么不直接让下属去多好啊,一步贪心,相当于把树进行了黑白染色,要么黑的去,要么白的去,比较一下大小不就好了?

我刚开始纠结了半天,后来发现了题中所给的条件。

关系满足一棵树,每个人都有自己的活跃值(-128~127)。

由于有些员工过于矫情,去派对自己还不活跃,所以之前的贪心是错误的。

之后比较老总(根节点)去或者不去的大小,选择较大值。

上代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int val[];
int indegree[];
int outdegree[];
struct edge
{
int to;
int nxt;
}eg[];
int head[];
int cnt = ;
void add(int x,int y)
{
eg[cnt].to = y;
eg[cnt].nxt = head[x];
head[x] = cnt++;
}
int dp[][];
void dfs(int x)
{
if(outdegree[x]==)
{
dp[x][] = val[x];
return ;
}
for(int i = head[x];i;i=eg[i].nxt)
{
int to = eg[i].to;
dfs(to);
dp[x][]+=dp[to][];
dp[x][]+=max(dp[to][],dp[to][]);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i = ;i<=n;i++)
{
scanf("%d",&val[i]);
dp[i][] = val[i];
}
for(int i = ;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x==&&y==)
{
break;
}
indegree[x]++;
outdegree[y]++;
add(y,x);
}
int root;
for(int i = ;i<=n;i++)
{
if(indegree[i]==)
{
root = i;
}
}
dfs(root);
printf("%d",max(dp[root][],dp[root][]));
}
												

最新文章

  1. 理解 Glance - 每天5分钟玩转 OpenStack(20)
  2. js调用刷新
  3. loadrunner取出关联数组中的所有元素
  4. [转] 基于 Apache Mahout 构建社会化推荐引擎
  5. window.open下载文件ie8请求的站点不可用的解决办法
  6. Line计划今年全面进军中国市场:建立本地团队
  7. 2 JavaScript应用开发实践指南
  8. 算法练习之DP 求LCM (最长公共子序列)
  9. dumpbin
  10. DBA 优化法则
  11. Discuz论坛URL静态化规则urlrewrite
  12. poj 3335 Rotating Scoreboard(半平面交)
  13. python转义字符——重点解释:\b,\n和\r区别
  14. SQL中笛卡尔积-cross join的用法
  15. maven构建myeclipse 工程
  16. jQuery 查找元素2
  17. IDEA下使用Maven的test命令乱码
  18. FTP主动模式和被动模式的区别(转)
  19. windowsAPI之OpenProcessToken,AdjustTokenPrivileges 和LookupPrivilegeValue&lt;转&gt;
  20. 理解TensorFlow的Queue

热门文章

  1. golang --- map如何判断key是否存在
  2. 推送一个docker 使用阿里docker hub
  3. 简单实现python调用c#dll动态链接库
  4. C# 创建json传输格式的http请求
  5. ELK部署配置使用记录
  6. String常用使用方法,1.创建string的常用3+1种方式,2.引用类型使用==比较地址值,3.String当中获取相关的常用方法,4.字符串的截取方法,5.String转换常用方法,6.切割字符串----java
  7. 2019 边锋游戏java面试笔试题 (含面试题解析)
  8. ERP会计科目表初始化
  9. vue脚手架创建项目及常用配置
  10. elementUI 2个输入框 时间区间月份选择