计划与实际交易路径的加权编辑距离
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] = 1 与 actual_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 = 20 而 replace_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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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。