import java.util.*;


public class Solution {
    /**
     * 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整型
     */
    //"abc","adc",5,3,100
    public int minEditCost (String str1, String str2, int ic, int dc, int rc) {
        if(str1 == null) {
            if(str2 == null) return 0 ;
            return str2.length() * ic ;
        }
        if(str2 == null) {
            if(str1 == null) return 0 ;
            return str1.length() * ic ;
        }
        char[] arr1 = str1.toCharArray() ;
        char[] arr2 = str2.toCharArray() ;
        //f[i][j]表示将str1的前i个字符编辑成str2的前j个字符 所花费的最小成本
        int f[][] = new int[arr1.length + 1][arr2.length + 1] ;
        for(int i = 0 ; i <= arr1.length ; i ++) {
            for(int j = 0 ; j <= arr2.length ; j ++) {
                if(i == 0) {
                    f[i][j] = ic * j ;
                    continue ;
                } 
                if(j == 0) {
                    f[i][j] = dc * i ;
                    continue ;
                }
                //增加,删除
                f[i][j] =  Math.min(f[i][j-1] + ic , f[i-1][j] + dc) ;
                //替换
                if(arr1[i-1] == arr2[j-1]) {
                    f[i][j] = Math.min(f[i][j] , f[i-1][j-1]) ;
                } else {
                    f[i][j] = Math.min(f[i][j] , f[i-1][j-1] + rc) ;
                }
            }
        }
        return f[arr1.length][arr2.length] ;
    }
}