半岛体育- 半岛体育官方网站- APP下载华为OD机试2023Q2:获取食物游戏
2025-11-07半岛,半岛体育,半岛体育app,半岛官网,半岛电竞,半岛真人,半岛棋牌,半岛体育官网注册,半岛体育官方app下载,半岛体育app下载,半岛体育怎么样,半岛体育官网,半岛体育登录入口,半岛体育官方网站游戏的地图由 N 个方格组成,每个方格上至多 2 个传送门,通过传送门可将参与者传送至指定的其它方格。同时,每个方格上标注了三个数字:
第一个数字 id :代表方格的编号,从 0 到 N - 1 ,每个方格各不相同;
第二个数字 parent-id :代表从编号为 parent-id 的方格可以通过传送门传送到当前方格( -1 则表示没有任何方格可以通过传送门传送到此方格,这样的方格在地图中有且仅有一个);
第三个数字 value :取值在 [100,100] 的整数值之间,正整数代表参与者得到相应取值单位的食物,负整数代表失去相应数值单位的食物(参与者可能存在临时持有食物为负数的情况), 0 则代表无变化。
第一个数字 id :代表方格的编号,从 0 到 N - 1 ,每个方格各不相同;
第二个数字 parent-id :代表从编号为 parent-id 的方格可以通过传送门传送到当前方格( -1 则表示没有任何方格可以通过传送门传送到此方格,这样的方格在地图中有且仅有一个);
第三个数字 value :取值在 [100,100] 的整数值之间,正整数代表参与者得到相应取值单位的食物,负整数代表失去相应数值单位的食物(参与者可能存在临时持有食物为负数的情况), 0 则代表无变化。
此外,地图设计时保证了参与者不可能到达相同的方格两次,并且至少有一个方格的 value 是正整数。
游戏开始后,参与者任意选择一个方格作为出发点,当遇到下列情况之一退出游戏:
参与者从方格 0 出发,通过传送门到达方格 4 ,再通过传送门到达方格 5 。一共获得 8+(−2)+3=9 个单位食物,得到食物最多 或者参与者在游戏开始时处于方格 2 ,直接主动宣布退出游戏,也可以获得 9 个单位食物。
参与者从方格 0 出发,通过传送门到达方格 2 ,一共可以获得 3+2=5 个单位食物,此时得到食物最多。
这保证题目一定是一个树形结构,即这个地图本身不存在环,而唯一存在的 parent-id = -1 的方格即为整个树形结构的根节点。这个设定大大地减少了我们思考问题的难度。
整个问题也就可以转变为:寻找树形结构中的一条路径,使得路径上所有节点的和最大。
树形结构,通常会用二叉树来表示,但这道题给的是 id , parent-id 和 val 这三个数据,因此我们考虑用一个哈希表 nodes 来储存这个树形结构,哈希表的 key 为父节点编号 parent-id ,哈希表的 value 为该父节点下的子节点 id 。而每一个节点的 val 我们可以储存在一个长度为 n 的列表 vals 中, vals 的索引即为这个节点的编号 id 。
我们思考这样的问题,假设我们走到某一个节点 cur_node ,为了计算包含当前节点的路径最大和cur_max ,我们都将面临以下选择:
而上述选择的结果,实际上取决于之前某一条路径能够取得比 0 更大的路径和。
假设当前节点 cur_node之前的路径最大和pre_max 已经被计算出来,如果:
pre_max 0 ,那么我们将舍弃前面的路径,因为如果加上前面的路径,我们只会使得当前路径总和 cur_max 更小,因此我们选择以这个当前节点作为一条新路径的开始节点。
pre_max = 0 ,无论当前节点的值如何,我们都将以这个当前节点为之前某一条路径的延伸,因为这样才能使得 cur_max 尽可能地大。
pre_max 0 ,那么我们将舍弃前面的路径,因为如果加上前面的路径,我们只会使得当前路径总和 cur_max 更小,因此我们选择以这个当前节点作为一条新路径的开始节点。
pre_max = 0 ,无论当前节点的值如何,我们都将以这个当前节点为之前某一条路径的延伸,因为这样才能使得 cur_max 尽可能地大。
在每一次计算得到 cur_max 之后,我们都必须更新一次全局的最大值 ans :
而调用 dfs 递归函数的入口为根节点 root ,根节点的 pre_max 为 0 ,表示根节点前面没有任何路径。
顺带提一嘴,对于上述最关键的 cur_max 的计算步骤,实际上也是一个dp过程。因为我们每一次都会根据 pre_max 的结果来对 cur_max 的计算做选择,所以式子 cur_max = vals[cur_node] if pre_max 0 else vals[cur_node] + pre_max 实际上就是一个动态转移方程,只不过我们是使用在 dfs递归函数中传参的形式来传递每一次的计算结果而已,而不需要显式地把dp数组写出来。
这也提醒我们,dp 和递归实际上有着非常深刻的内在联系,这一点需要同学们多多体会。
# 将树形结构用哈希表的形式储存,key为父节点编号,value为该父节点下的子节点
# 1. 如果之前路径最大和是个负数,那么不再考虑前面的路径,应该从当前节点重新出发,
# 2. 如果之前路径最大和是个正数,那么以当前节点为结尾的路径的最大和应该加上之前路径最大和,
# 如果当前节点cur_node不位于nodes哈希表中,即cur_node不是任何节点的父节点
# 如果节点cur_node位于nodes哈希表中,即仍有向下走的可能性
# 调用dfs函数,入口为根节点root,根节点的pre_max为0,即前面没有任何路径
为了节省大家的时间也节省我的时间,我们决定内测开一个 30 课时的华为 OD 冲刺辅导小班,小班人数控制在 10 人以内,目前已经有 6 个人报名了,学习周期安排在 20 天左右完成。
1、学习华为 OD 考试( 笔试 + 面试手撕 )涉及的算法知识,直播和视频双管齐下
2、了解华为 OD 面试的全流程,以及专门针对华为 OD 的技术面试辅导


