D. 字符串转换

    传统题 文件IO:t4 1000ms 256MiB

字符串转换

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

T4. 字符串转换

属性
内存限制 256 MiB
时间限制 1000 ms

题目描述

小蓝正在学习文本编辑,她有两个字符串 AABB。她希望通过若干次操作将字符串 AA 变成字符串 BB。允许的操作有三种:

  1. 删除:删除 AA 中的一个字符,代价为 cdc_d
  2. 插入:在 AA 的任意位置插入一个字符,代价为 cic_i
  3. 替换:将 AA 中的一个字符替换为另一个字符,代价为 crc_r

注意:操作的代价是正整数,且三种操作的代价可能各不相同。

请你帮助小蓝计算:将字符串 AA 变为字符串 BB 所需的最小总代价

输入格式

第一行一个字符串 AA

第二行一个字符串 BB

第三行三个整数 cd,ci,crc_d, c_i, c_r,分别表示删除、插入、替换操作的代价。

输出格式

输出一行一个整数,表示最小总代价。

样例

样例 #1

输入样例(t4.in)

abc
abd
2 3 1

输出样例(t4.out)

1

解释:将 c 替换为 d,代价 cr=1c_r = 1,总代价 11。也可以先删除 c(代价 22)再插入 d(代价 33),总代价 55。最小为 11

样例 #2

输入样例

horse
ros
1 1 1

输出样例

3

解释:经典编辑距离,删除、插入、替换代价均为 11。最少需要 33 步: horse → 替换 hrrorse → 删除第 33rrose → 删除 eros

样例 #3

输入样例

ab
ba
1 2 3

输出样例

3

解释:删除代价 11,插入代价 22,替换代价 33

方案一:先删除 a(代价 11)得到 "b",再在末尾插入 a(代价 22)得到 "ba",总代价 33

方案二:先删除 b(代价 11)得到 "a",再在前面插入 b(代价 22)得到 "ba",总代价 33

方案三:两次替换(代价 3+3=63+3=6)。最小为 33

数据范围与提示

测试点编号 A,B\lvert A \rvert, \lvert B \rvert \le 特殊约定
121 \sim 2 1010 无特殊约定
353 \sim 5 200200
686 \sim 8 10001000 cd=ci=cr=1c_d = c_i = c_r = 1
9109 \sim 10 无特殊约定

对于 100%100\% 的数据,1A,B10001 \le |A|, |B| \le 10001cd,ci,cr10001 \le c_d, c_i, c_r \le 1000。字符串 A,BA, B 仅由小写英文字母组成。

提示

  • 定义 dp[i][j]dp[i][j] 表示将 AA 的前 ii 个字符转换为 BB 的前 jj 个字符所需的最小代价(0iA0 \le i \le |A|0jB0 \le j \le |B|)。
  • 初始化:
    • dp[0][0]=0dp[0][0] = 0
    • dp[i][0]=i×cddp[i][0] = i \times c_d(删除 AA 的前 ii 个字符);
    • dp[0][j]=j×cidp[0][j] = j \times c_i(插入 BB 的前 jj 个字符)。
  • 转移方程(1iA1 \le i \le |A|1jB1 \le j \le |B|):
    • 删除:dp[i1][j]+cddp[i-1][j] + c_d
    • 插入:dp[i][j1]+cidp[i][j-1] + c_i
    • 替换/匹配:dp[i1][j1]+(A[i1]==B[j1]  ?  0:cr)dp[i-1][j-1] + (A[i-1] == B[j-1] \;?\; 0 : c_r)
    • dp[i][j]=min(删除,插入,替换/匹配)dp[i][j] = \min(删除, 插入, 替换/匹配)
  • 字符串下标从 00 开始,注意与 DP 状态下标(从 11 开始)的对应关系。
  • 时间复杂度 O(A×B)O(|A| \times |B|),空间可优化为 O(B)O(|B|)(滚动数组)。

24KOI 2026 体验赛 No.01

未参加
状态
已结束
规则
OI
题目
4
开始于
2026-6-20 11:30
结束于
2026-6-20 15:00
持续时间
3.5 小时
主持人
参赛人数
17