题目重点:汇总帖给 travel 边、point 奖励和固定 start/多个 end;图若为 DAG 可拓扑 DP,正收益环时须明确边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版是有向无环图,end 节点是名称以 END 开头的终点;固定起点 start 分数 0,起点奖励不计。
- 每次到达 v 得 reward(v) 并扣 travel 边 cost(u,v);未列 reward 的节点记 0,路径可在任意 end 结束。
- 若同一节点可重复访问且正收益环可达 end,最大分可能无界;若只允许简单路径,一般图上问题复杂度变高,不能直接用 DAG DP。
解题路线
- 解析 travel 边与 point 奖励,明确重复边和节点标识;只考虑从 start 可达的子图,并找 end 候选。
- 若确认 DAG,求拓扑序,设 dp[start]=0、其余 -∞,按拓扑序对每条边 u→v 更新 dp[v]=max(dp[v],dp[u]−cost+reward(v))。
- 维护 parent 以恢复最优路径;若多个 end,返回 max dp[end],无可达 end 返回明确空/失败值。
- 正确性:拓扑序处理 v 前所有前驱最优值已算好,每条入边只扩展对应最优前缀,因 DAG 不会遗漏循环改进。
- 若图有环,应先问是否只允许简单路径/一次奖励;如果允许重复且收益正环,先检测可达并能到 end 的正环,不可声称有限答案。
手动走一遍
训练图 start→A cost3、A reward5,故 dp[A]=2;A→END1 cost4、END1 reward3,得到 1。另有 start→B cost2、B reward1,B→END2 cost1、END2 reward7,得 5,应选择 END2。数字是按题目规则构造的示例。
规模与取舍
DAG 上拓扑 DP O(V+E) 时间、O(V+E) 存图和父指针;如果输入并非 DAG,该复杂度与算法不适用,需按实际限制另解。
易错点与追问
容易失分的边界
- 只计终点奖励或只减最后一条边成本。
- 把多终点中的第一个当唯一答案。
- 没有判断不可达就把 -∞ 与整数相加。
- 在一般有环图上直接跑拓扑 DP。
- 把最大收益路径当作最短路取负权后直接 Dijkstra。
继续深挖
- 若存在环但每个点奖励只拿一次怎么办?
- 怎样输出路径而非只返回分数?
- 多个同分终点如何 tie-break?
- 若数据持续更新,是否能增量维护?
