class Solution {
public:
    /**
     * 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整型
     */
    int minEditCost(string str1, string str2, int ic, int dc, int rc) 
    {
        int m = str1.length(), n = str2.length();
        // str1[0, i - 1] -> str2[0, j - 1] 最小代价
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0x7FFFFFFF));
        dp[0][0] = 0;
        for(int i = 1; i <= m; ++i)
        {
            dp[i][0] = i * dc;
        }
        for(int j = 1; j <= n; ++j)
        {
            dp[0][j] = j * ic;
        }
        for(int i = 1; i <= m; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                if(str1[i - 1] == str2[j - 1])
                {
                    dp[i][j] = dp[i - 1][j - 1];
                }
                else
                {
                    int _ic = dp[i][j - 1] + ic;
                    int _dc = dp[i - 1][j] + dc;
                    int _rc = dp[i - 1][j - 1] + rc;
                    dp[i][j] = min(min(_ic, _dc), _rc);
                }
            }
        }
        return dp[m][n];
    }
};