连在一起的指令文字怎样找最低成本切分:状态推演第04例
把一串没有分隔符的文字切成已知指令时,最长前缀未必让整串成本最低。记录每个前缀的最佳结果,可以比较多种切分并在无法解释的后缀处明确报无解。
先把规则写清楚
字典给每个合法片段一个正整数成本。状态dp位置i表示前i个字符的最低总成本,从零开始;尝试所有能在i之后匹配的片段,并更新结束位置。成本相同优先片段更少,再按完整片段序列的字母顺序确定唯一结果。
本例输入与推演结果
输入串BCABCAABCAAAB;字典及成本{'A': 6, 'B': 5, 'C': 5, 'AB': 9, 'BC': 4, 'CA': 2, 'ABC': 8, 'BCA': 3, 'AA': 4, 'CC': 9, 'CAB': 3}。
前缀长度 | 前缀 | 最低成本、片段数、片段序列 0 | 空串 | (0, 0, ()) 1 | B | (5, 1, ('B',)) 2 | BC | (4, 1, ('BC',)) 3 | BCA | (3, 1, ('BCA',)) 4 | BCAB | (8, 2, ('B', 'CAB')) 5 | BCABC | (7, 2, ('BCA', 'BC')) 6 | BCABCA | (6, 2, ('BCA', 'BCA')) 7 | BCABCAA | (11, 3, ('BCA', 'BC', 'AA')) 8 | BCABCAAB | (15, 3, ('BCA', 'BCA', 'AB')) 9 | BCABCAABC | (14, 3, ('BCA', 'BCA', 'ABC')) 10 | BCABCAABCA | (14, 4, ('BCA', 'BC', 'AA', 'BCA')) 11 | BCABCAABCAA | (18, 4, ('BCA', 'BCA', 'ABC', 'AA')) 12 | BCABCAABCAAA | (18, 5, ('BCA', 'BC', 'AA', 'BCA', 'AA')) 13 | BCABCAABCAAAB | (23, 6, ('BCA', 'BC', 'AA', 'BCA', 'AA', 'B'))这里的编号只用来辨认本例中的对象,不能当成另一份记录里的固定身份。阅读表格时先找到输入,再顺着运算顺序对照输出;空列表、零值和不存在的结果有不同含义,不能混用。表中分数保留精确值,小数显示仅为阅读方便。
怎样自己复核
每个结果中的片段连接后必须恰好等于输入串,不能漏字、多字或交换顺序。不可达位置标为空,而不是成本零。表中的前缀最佳解只服务于自己的结束位置,不能把不同位置的状态直接拿来比较长短。
从最终位置沿片段重建完整解释,再把所有成本相加核对。练习时加入一个字典不包含的字符,应得到无解而不是静默丢弃它。若成本依赖前一个片段,就要把前一片段的信息加入状态,当前只按位置记录的表不再足够。
适用范围
这是一种明确给定的文字切分模型,没有语义推断、拼写纠错或上下文语法。成本不是概率,贪心选择最长片段或最便宜的单个片段都未必最优。
本例是一套可复现的游戏机制练习,不依赖具体品牌或某个软件的默认设置。修改任何边界约定、输入参数或操作顺序后,应重新推演并保存中间状态。发现差异时先定位第一处不一致,再判断是规则不同还是计算错误,不要只把最终答案调整到看起来相同。