← 返回编程题库
coding-weighted-edit-trade-paths困难免费版4000ms未尝试

计划与实际交易路径的加权编辑距离

Weighted-Cost Edit Distance Between Trade-Action Paths

开始编码

开盘前交易员发布 planned_path——一段整数交易动作码(-1 卖一手、0 持有、+1 买一手,但任意有符号整数都可作为自定义动作码);当日执行台依次触发的真实成交序列记为 actual_path,与计划往往并不一致。合规与 TCA 桌台用「把 planned_path 变换成 actual_path 的最小整数代价」来衡量当日的「intent-vs-execution 漂移」,三种基本操作各有独立的整数代价:insert_cost 表示插入一笔未被计划但实际打出的动作;delete_cost 表示删除一笔被计划但未打出的动作;replace_cost 表示把一笔计划动作替换为不同的实际动作。replace 代价仅在真正失配时才收取——对角步若代码相等则免费。

实现 solution(planned_path: list[int], actual_path: list[int], insert_cost: int, delete_cost: int, replace_cost: int) -> int。返回最小代价(非负整数)。三种代价均为非负整数,上限为一百万;动作码可为任意有符号整数;两条路径长度各自最长为 1500,因此 O(N*M) 二维 DP 完全可在限时内求解,而枚举所有编辑脚本则会超时。

例如 solution([0, 1, -1, 1], [0, -1, -1, 1], 1, 1, 1) 返回 1:单位代价下递推式即为 LC72,只有 planned_path[1] = 1actual_path[1] = -1 一处失配,付 1 次 replace 代价 1。再如 solution([-1, 0, 1], [1, 0, -1], 1, 1, 10) 返回 4——首尾两处失配,但 replace_cost = 10 超过 delete_cost + insert_cost = 2,DP 在两端各走一次「删 + 插」共 2 + 2 = 4,远优于走两次 replace 的 20。把代价反过来 solution([-1, 0, 1], [1, 0, -1], 10, 10, 1) 返回 2:此时 delete_cost + insert_cost = 20replace_cost = 1,DP 选两次便宜的 replace。

实践背景

合规与 TCA(Transaction Cost Analysis)桌台日常需要量化当日实际执行与开盘前计划之间的偏离。简单计数失配数过于粗糙——它看不到「漏掉一笔成交」(delete)、「触发一笔计划外对冲」(insert)与「在同一手仓位上方向反转」(replace)三类事件在 P&L 与监管报告上的差异。给三种基本操作各自一个独立整数代价,问题就转化为「加权编辑距离」:开盘前桌台公布计划动作序列,收盘后 OMS 回放实际成交,最小代价变换——由教科书编辑距离同一套二维 DP 求解——即为当日的漂移分。关键在于:当 replace 的代价比「删 + 插」更高(典型情形:错向成交触发额外报告流程),最优对齐自然回避 replace;当 replace 廉价(同手数反向单内部抵消),对齐就以 replace 为主。DP 完全靠逐格三选一最小自动识别这两种情形,无需按代价顺序特判——这正是该加权版本相对单位代价 LC72 的本质区别。

约束条件

  • 0 ≤ `len(planned_path)` ≤ 1500
  • 0 ≤ `len(actual_path)` ≤ 1500
  • `planned_path` 与 `actual_path` 的每个元素均可放入 32 位有符号整数(任意有符号整数)
  • 0 ≤ `insert_cost` ≤ 10**6(整数)
  • 0 ≤ `delete_cost` ≤ 10**6(整数)
  • 0 ≤ `replace_cost` ≤ 10**6(整数)
  • replace 代价仅在 `planned_path[i] != actual_path[j]` 时收取;代码相等的对角步免费
  • 两侧都为空 → 返回 `0`;planned 为空 → 返回 `insert_cost * len(actual_path)`;actual 为空 → 返回 `delete_cost * len(planned_path)`
  • 最小总代价始终是非负整数,不抛出异常

样例

Case 1 · typical: example unit costs

输入: [[0,1,-1,1],[0,-1,-1,1],1,1,1]

期望: 1

单位成本 (1,1,1) 等价 LC72;planned[1]=1 与 actual[1]=-1 不同,replace 一次代价 1。

Case 2 · typical: high replace forces delete+insert

输入: [[-1,0,1],[1,0,-1],1,1,10]

期望: 4

replace_cost=10 远大于 delete+insert=2,DP 在每个不匹配处选择删+插;首尾两次失配 → 4。

Case 3 · typical: cheap replace preferred

输入: [[-1,0,1],[1,0,-1],10,10,1]

期望: 2

delete+insert=20 远高于 replace=1,首尾两次失配各 replace 一次 → 2。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · typical: example unit costs

输入: [[0,1,-1,1],[0,-1,-1,1],1,1,1]

期望: 1

单位成本 (1,1,1) 等价 LC72;planned[1]=1 与 actual[1]=-1 不同,replace 一次代价 1。

Case 2 · typical: high replace forces delete+insert

输入: [[-1,0,1],[1,0,-1],1,1,10]

期望: 4

replace_cost=10 远大于 delete+insert=2,DP 在每个不匹配处选择删+插;首尾两次失配 → 4。

Case 3 · typical: cheap replace preferred

输入: [[-1,0,1],[1,0,-1],10,10,1]

期望: 2

delete+insert=20 远高于 replace=1,首尾两次失配各 replace 一次 → 2。