动态规划--计划一个公司聚会
2012-05-06 18:25
375 查看
问题: Stewart教授是一家公司总裁的顾问,这家公司计划一个公司聚会。这个公司有一个层次结构;也就是,管理关系形成一棵以总裁为根的树。人事部给每个雇员以喜欢聚会的程度来排名,这是一个实数。为了使每个参加者都喜欢这个聚会,总裁不希望一个雇员和他(她)的直接上司同时参加。
Stewart教授面对一颗描述公司结构的树,使用了10.4节描述的左子女、右兄弟表示法。树中每个节点除了包含指针,还包含雇员的名字以及该雇员喜欢聚会的排名。描述一个算法,它生成一张客人列表,使得客人喜欢聚会的程度的总和最大。分析你的算法的执行时间。
分析:
对每个节点添加两个域SelectRoot和UnselRoot。SelectRoot意味着当该节点被选择时,以该节点为根的子树的最大聚会喜欢程度。UnselRoot意味着当该节点不被选择时,以该节点为根的子树的最大聚会喜欢程度。
假设原先每个节点的两个域名字和聚会喜欢程度为Name,Like。初始时,每个叶子节点的SelectRoot为其Like值,UnselRoot为0。
依次向上计算每个节点的SelectRoot和UnselRoot值
最终只需要查看总裁节点,取其SelectRoot和UnselRoot中的最大值。
要记录客人列表,则只需从树的的第二层开始,每一层做如下操作:如果parent被选,则当前层都不选;如果parent未被选,则看当前层中每个节点的SelectRoot和UselRoot的大小关系,如果SelectRoot大,则选中该节点,否则,不选该节点。遍历完树之后,参加的客人便都标记出来了。
计算n个节点的SelectRoot和UnselRoot,每次计算都只使用子节点的域值,所以整个计算的过程也只累加了树中除了根的其它节点的域值(每个节点就被用一次)。所以算法复杂度为O(n)。
Stewart教授面对一颗描述公司结构的树,使用了10.4节描述的左子女、右兄弟表示法。树中每个节点除了包含指针,还包含雇员的名字以及该雇员喜欢聚会的排名。描述一个算法,它生成一张客人列表,使得客人喜欢聚会的程度的总和最大。分析你的算法的执行时间。
分析:
对每个节点添加两个域SelectRoot和UnselRoot。SelectRoot意味着当该节点被选择时,以该节点为根的子树的最大聚会喜欢程度。UnselRoot意味着当该节点不被选择时,以该节点为根的子树的最大聚会喜欢程度。
假设原先每个节点的两个域名字和聚会喜欢程度为Name,Like。初始时,每个叶子节点的SelectRoot为其Like值,UnselRoot为0。
依次向上计算每个节点的SelectRoot和UnselRoot值
最终只需要查看总裁节点,取其SelectRoot和UnselRoot中的最大值。
要记录客人列表,则只需从树的的第二层开始,每一层做如下操作:如果parent被选,则当前层都不选;如果parent未被选,则看当前层中每个节点的SelectRoot和UselRoot的大小关系,如果SelectRoot大,则选中该节点,否则,不选该节点。遍历完树之后,参加的客人便都标记出来了。
计算n个节点的SelectRoot和UnselRoot,每次计算都只使用子节点的域值,所以整个计算的过程也只累加了树中除了根的其它节点的域值(每个节点就被用一次)。所以算法复杂度为O(n)。
相关文章推荐
- 动态规划--计划一个公司聚会
- 动态规划--计划一个公司聚会
- 算法导论-15-4-计划一个公司聚会
- 计划一个公司聚会
- 计划一个公司聚会
- 算法导论-15-4-计划一个公司聚会
- ACM:计划一个公司聚会 (大一时头疼…
- 动态规划有一个经典问题是最长公共子序列
- 很特别的一个动态规划入门教程
- uva 1380 - A Scheduling Problem 一个调度问题 好难的动态规划
- leetcode 413. Arithmetic Slices 等差子数组 + 一个很简单DP动态规划做法
- 动态规划问题--最长公共子序列(LCS)问题--删除一些字符使得剩下的是一个回文子串
- 一个简单的动态规划题
- 很特别的一个动态规划入门教程
- 很特别的一个动态规划入门教程
- 很特别的一个动态规划入门教程
- 动态规划的一个例子
- 基础算法系列总结:动态规划(解公司外包成本问题)
- 很特别的一个动态规划入门教程
- 100道动态规划——22 POJ 1661 帮助 Jimmy 记忆化搜索 状态定义 以及一个思维上的漏洞