原题
翻译
非常好的一个题,有两种做法
方法1:flody+dp
首先我们确定一个最优行走方案:从 号节点赚到足够钱后通过最短路到达 ,在 赚够足够钱后到达 ,在 赚够足够钱后到达 ,如此往复后到达终点
现在我们有一个问题:从 到 的路径,到达 点后有许多结局。我们考虑一个非常朴素的 : 表示走到 号点,剩余钱为 的最少表演次数,但这很明显会 ,寄
但我们发现我们还有一个东西没用:每个点的权值。我们考虑通过转移顺序优化 ,我们用二元组 表示走到 号点,表演 次且最少表演次数为 。这么做 很明显是不对的,因为我们不知道 和 优先从哪个转移。但我们如果把 从小到大排个序,按照顺序考虑,那这个 就对了
因为我们考虑假如当前 点的 值的前驱是从 转移过来的,我们现在在考虑 对 的贡献,因为我们按照点权大小排了序,则我们可以保证 ,这有什么好处呢?这说明如果出现了 ,则无论 的大小关系如何,我们都会选择用 更新。因为 ,我们让这个人在 点赚钱 次,赚得的钱数 ,因此我们从 转移更优。
但是还没完,如果 ,则我们优先考虑 更大的即可
因此我们只需要对图 的跑一边 即可解决问题
最终复杂度 ,复杂度瓶颈在于
方法2:dijkstra + dp
我们考虑朴素 ,设 表示走到 点的路径上经过的最小点权的点为 ,还剩 元的最少赚钱次数。这个 显然会 ,因此我们考虑优化他。同上一个做法,我们设 。然后同样的,我们把 当作第一关键字, 当作第二关键字即可。注意,这里并不需要排序,因为我们在 的状态里记录了上一个转移的点,对于 相同的 状态, 的值显然是相同的。
因此我们直接用 优化 转移即可
最终复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?