计划一个公司聚会

问题描述:

Stewart教授是一家公司总裁的顾问,这家公司正在计划一个公司的聚会。这个公司有一个层次式的结构;也就是,管理关系形成一颗以总裁为根的树。人事部门按每个员工喜欢聚会的程度来排名,排名是一个实数。为了使每个参加聚会者都喜欢这个聚会,总裁不希望一个雇员和她的直接上司同时参加。

Stewart教授面对一颗描述公司结构的树,使用了左孩子右兄弟描述法。树中每个节点除了包含指针,还包含雇员的名字以及雇员喜欢聚会的排名。描述一个算法,它生成一张客人列表,使得客人喜欢聚会的程度的总和最大。分析你的算法的执行时间。

要求你算出最大的喜欢程度和。

Sample Input:

n: 员工个数, 接下一行输入每个员工对这次party的喜欢程度.

接下的n行内, 每行输入u:员工编号, num: 该员工下属的个数, vi: 该员工的第i个下属的编号(0<=i<n)

Sample Output:

输出最大的喜欢程度和.

Sample Input:

5
2 3 5 4 4
0 2 2 3
2 1 1
1 1 4
3 0
4 0

6
20 3 5 4 5 30
0 2 2 3
2 1 1
3 1 4
1 0
4 1 5
5 0

Sample Output:

13

53

题意: 上述中文描述

解题思路:

1. 每个员工可以设置2个状态state: 参加和不参加.

2. 动态规划求解, 设状态: dp[node][0]: node员工不参加party的及其下属的最大喜欢程度.

dp[node][1]: node员工参加party的及其下属的最大喜欢程度.

3. 状态转移方程:

dp[node][0] = ∑max(DP(i,0),DP(i,1)); (i是node的直接下属编号)

dp[node][1] = a[node]+∑DP(i,0); (a[node]: node员工对聚会的喜欢程度);

4. 最后结果是: result = max(DP(root,0) , DP(root,1));

因为root没有上司所以要分别求2次, 最后取较大值.

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 105

int n; //员工数量
bool g[MAX][MAX]; //保存员工树状关系
int a[MAX]; //对party的喜欢程度
int root; //无上司的人 (boss)
int dp[MAX][2]; //dp[i][0]: node不参加; dp[i][1]: 参加

inline int max(int a,int b)
{
 return a > b ? a : b;
}

void read_graph()
{
 int i, j;
 memset(g,false,sizeof(g));
 memset(dp,-1,sizeof(dp));
 for(i = 0; i < n; ++i)
  scanf("%d",&a[i]); //每个人对party的喜欢程度

int u, v;
 int num;
 for(i = 0; i < n; ++i)
 {
  scanf("%d %d",&u,&num); //每个人得编号和下属个数
  for(j = 0; j < num; ++j)
  {
   scanf("%d",&v); //下属编号
   g[u][v] = true;
  }
 }
 root = 0;
}

int DP(int node, int state) //当前节点node, state: 是否参加party
{
 if(dp[node][state] != -1) return dp[node][state];
 int ans;
 if(state == 0) //node不参加party
 {
  ans = 0;
  for(int i = 0; i < n; ++i)
  {
   if(g[node][i])
    ans += max(DP(i,0),DP(i,1));
  }
  dp[node][state] = ans;
  return ans;
 }
 else //node参加party
 {
  ans = a[node];
  for(int i = 0; i < n; ++i)
  {
   if(g[node][i])
    ans += DP(i,0);
  }
  dp[node][state] = ans;
  return ans;
 }
 
}

int main()
{
 freopen("input.txt","r",stdin);
 while(scanf("%d",&n) != EOF)
 {
  read_graph();
  int result = DP(root,0); //分别算出root节点是否参加party
  memset(dp,-1,sizeof(dp));
  result = max(result, DP(root,1));
  cout << result << endl;
 }

return 0;
}

ACM:计划一个公司聚会nbsp;(大一时头疼…相关推荐

  1. ACM图灵奖获得者:想从大数据中获益,先解决集成问题!

    文章讲的是ACM图灵奖获得者:想从大数据中获益,先解决集成问题!如今,大数据对所有行业都产生了深远影响:从医疗保健.汽车.电信到物联网.随着数据浪潮的持续,企业都在寻找更新的管理和分析方法.收集可行的 ...

  2. 中国哪些公司在做大数据

    2019独角兽企业重金招聘Python工程师标准>>> "大数据"近几年来可谓蓬勃发展,它不仅是企业趋势,也是一个改变了人类生活的技术创新.大数据对行业用户的重要 ...

  3. 何为一个公司的护城河?

    内容学习整理自 知识星球--产品学徒 1:一家企业最重要的竞争优势,不是今年赚了多少钱,而是明年能不能继续赚钱. 公司有没有自给自足的能力?自己是否有造血能力.有没有持续的稳定的健康的现金流.这就是这 ...

  4. 程序员初入公司:10大经验让你能力提升20倍!

    IT企业普遍有个特点,"把女人当男人用,把男人当**(此处略去2个字)用." 有句俗话说,"男怕入错行",我想这句话其实也同样适用IT女生. 我们可以做个小测试 ...

  5. 程序员初入公司:10大经验让你能力提升20倍! 1

    IT企业普遍有个特点,"把女人当男人用,把男人当**(此处略去2个字)用." 有句俗话说,"男怕入错行",我想这句话其实也同样适用IT女生. 我们可以做个小测试 ...

  6. 盛景网联:从培训公司到资本大鳄

    盛景网联:从培训公司到资本大鳄(转) 文/孙骋 彭志强坐在沙发上,不言语的时候,看起来比实际年龄老成一些:头发从脑门向后梳,戴一副金丝眼镜.当他开口,谈吐里的学术气息,大概源于多年给企业主讲课的经历. ...

  7. “一个千古绝伦的大智者”莱布尼茨

    ►哥特弗里德·威廉·莱布尼茨(Gottfried Wilhelm Leibniz) 编者按: 莱布尼茨生于德国,成名于法国,因与牛顿的微积分"优先权之争"而与英国学术界纠葛--多才 ...

  8. Jonathan Bryce说:OpenStack属于全世界,并不属于一个公司,也不会属于一个国家……...

    戳蓝字"CSDN云计算"关注我们哦! "openstack这个软件是属于全世界的,并不属于一个公司,也不会属于一个国家." 这是OpenStack基金会创始人兼 ...

  9. [转]把人当成一个公司来经营,心就不会那么累

    本文转自:http://blog.sina.com.cn/s/blog_181b5b47e0102y0v2.html 为什么有的人笃定踏实,有的人风风火火,到头来有的人收获智慧和幸福,有的人终生跟自己 ...

最新文章

  1. vs2010类文件添加版权版本作者信息
  2. 内部排序——直接插入排序
  3. Mysql 获取当月和上个月第一天和最后一天的SQL
  4. python中xrange函数_python中xrange和range的区别
  5. case when then else多个条件_CentOS「linux」学习笔记24:if和case多个条件判断
  6. VTK:绘图之PieChartActor
  7. 【数据结构与算法】字符串匹配 KMP 算法
  8. mysql查询包含字符串(模糊查询)
  9. SqlDictionary表,使用SQL语句查询TableID
  10. 管理Kubernetes集群时需要关注的关键指标
  11. Atitit 提升开发效率几大策略 目录 1. 提升效率三原则 2 1.1. 更少的工作 2 1.2. 优化配置减少等待 2 1.3. 提升一次性处理能力 2 2. 方法提升 3 2.1. 分类优
  12. Windows系统服务原理
  13. Excel2013 破解(编辑工作表受保护)密码
  14. 用友u8服务器修改ipv4,用友U8-OA11.1 用友U8加密狗更换服务器了-用友U8
  15. 支付宝是怎么炼成的?蚂蚁金融级研发效能实践解析
  16. 写一个简单的登录页面!!!(html)
  17. Typora结合Git打造完美的个人云笔记本
  18. 《关于2010年计算机信息系统集成项目经理资质申报有关事项的通知》
  19. 如何让IE窗口打开时就自动默认为最大化
  20. csdn首篇笔记——关于笔记本身

热门文章

  1. python上传文件到onedrive_PyOne——另一款支持OneDrive目录浏览的程序
  2. think.class.php错误,thinkphp源码分析(四)—错误及异常处理篇
  3. Asterisk对接潮流的FXO网关GXW410x实现异地落地方法
  4. C++ Socket UDP范例
  5. Java项目:医疗药品采购系统(java+SSM+JSP+jQuery+h-ui+mysql)
  6. GetAsyncKeyState() 0x8000 是什么意思
  7. 2021-11-26 vue项目中如何引入iconfont图标库
  8. 汇编中偏移地址的理解
  9. Word2007删除页眉横线
  10. (转载)typed用法总结