不知为啥爆内存, 这是python标准的动态规划解法了。
相较于原始的编辑距离题目(插入,删除,替换代价相同),这道题插入,删除,替换的代价不同。不过难度并没有多大提升。
如果还不会原始题目的动态规划解法,建议先去弄懂(把三种方式的代价固定为1就是原始题目的答案)
看代码:

#
# min edit cost
# @param str1 string字符串 the string
# @param str2 string字符串 the string
# @param ic int整型 insert cost
# @param dc int整型 delete cost
# @param rc int整型 replace cost
# @return int整型
#
class Solution:
    def minEditCost(self , str1 , str2 , ic , dc , rc ):
        # str1为空时,插入lens2个字符得到str2
        # str2为空时,删除lens1个字符得到str1
        lens1, lens2 = len(str1), len(str2)
        if lens1 == 0: return lens2 * ic
        if lens2 == 0: return lens1 * dc

        # 初始化dp数组
        dp = [[0] * lens2 for _ in range(lens1)]

        dp[0][0] = 0 if str1[0] == str2[0] else rc
        # str2长度增加时,由str1[0]得到str2需要不断插入
        for i in range(1, lens2):
            dp[0][i] = dp[0][i-1] + ic
        # str1长度增加时, 由str1得到str2[0]需要不断删除
        for i in range(1, lens1):
            dp[i][0] = dp[i-1][0] + dc

        # 主循环
        for i in range(1, lens1):
            for j in range(1, lens2):
                # 两个字符相同时,在dp[i-1][j-1]的基础上不需要代价,否则需要替换一个字符
                cost = 0 if str1[i] == str2[j] else rc
                dp[i][j] = min(dp[i-1][j-1] + cost,  # 在dp[i-1][j-1]的基础上替换/不替换字符
                               dp[i-1][j] + dc,  # 在dp[i-1][j]的基础上删除一个字符
                               dp[i][j-1] + ic)  # 在dp[i][j-1]的基础上插入一个字符
        return dp[lens1-1][lens2-1]