动态规划:
首先生成一个大小为(M+1)X(N+1)的矩阵dp,dp[i][j]的值代表str1[0..i-1]编辑成str2[0..j-1]的最小代价。

public int minEditCost (String str1, String str2, int ic, int dc, int rc) {
        // write code here
        if (str1 == null || str2 == null){
            return 0;
        }
        char[] cs1 = str1.toCharArray();
        char[] cs2 = str2.toCharArray();
        int row = cs1.length + 1;
        int col = cs2.length + 1;
        int[][] dp = new int[row][col];
        for (int i = 0; i < row; i++) {
            dp[i][0] = dc * i;
        }
        for (int i = 0; i < col; i++) {
            dp[0][i] = ic * i;
        }

        for (int i = 1; i < row; i++) {
            for (int j = 1; j < col; j++) {
                if (cs1[i-1] == cs2[j-1]){
                    dp[i][j] = dp[i-1][j-1];
                }else {
                    dp[i][j] = dp[i-1][j-1] + rc;
                }
                dp[i][j] = Math.min(dp[i][j], dp[i][j-1] + ic);
                dp[i][j] = Math.min(dp[i][j], dp[i-1][j] + dc);
            }
        }
        return dp[row-1][col-1];
    }