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) {
        // write code here
        int m = str1.length(), n = str2.length();
        if(m ==0 || n == 0){
            int res = min(ic, dc)*max(m, n);
        }
        
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        
        for(int i=1; i<n; i++){
            dp[0][i] = dp[0][i-1] + ic;
        }
        for(int i=1; i<m; i++){
            dp[i][0] = dp[i-1][0] + dc;
        }
        
        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{
                    dp[i][j] = min(dp[i-1][j-1] + rc,
                                   min(dp[i][j-1] + ic,
                                       dp[i-1][j] + dc));
                }
            }
        }
        return dp[m][n];
    }
};