P1279 字串距离
对于给定两个字符串
扩展后可以得到 (
可以发现此时
所以我们可以将问题转化,如下:
给定两个字符串,你可以在这两个字符串分别删除掉若干个字符。每删除一个字符将花费
如果这样的话那么这道题就很好想了,考虑动态规划解决这一类问题。
设计
那么接下来考虑转移,对于
- 删除
a 的第i 位(需要K 的距离代价),不再考虑a 的第i 位的任何影响,则等价于a 的前i-1 位和b 的前j 位匹配(匹配指通过删除字符得到一致的长度)的最小距离代价。
得到该情况的转移式子:
- 删除
b 的第j 位(需要K 的距离代价),不再考虑b 的第j 位的任何影响,则等价于b 的前j-1 位和a 的前i 位匹配(匹配指通过删除字符得到一致的长度)的最小距离代价。
得到该情况的转移式子:
- 我们希望
a 的第i 位和b 的第j 位都不要删除掉,则此时由于状态定义保证i 和j 应该为同一位(状态保证两字符串长度一致,且此时i 和j 都为未删除的最后一位置 ),那么此时处于同一位置的都未删除的两个字符应考虑距离代价,根据题目对非空字符距离的定义,得到此时的距离代价为abs(a_i-b_i) (a_i-b_i 在编译器里会自动转换成为字符ASCII 码的计算),由于a 的第i 位和b 的第j 位都考虑好了,那么得到转移式子:f_{i,j}=min(f_{i-1,j-1}+abs(a_i-b_i)) 。