class MinCost {
public:
    int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) {
        //原版的编辑代价的基础上每个操作加入的权重,修改一下状态转移方程即可
        //注意边界条件也有所变化
        //仍然使用一行数组和一个额外空间记录左上位置即可
        vector<int>dp(m+1);
        //初始化要注意
        for(int i=0 ;i<=m; i++)
            dp[i]=i*c0;//只能全部增加
        //循环处理
        for(int i=1; i<=n; i++)
        {
            int prev=dp[0];//记录左上位置
            dp[0]=i*c1;//只能全部删除
            for(int j=1; j<=m; j++)
            {
                int tmp=dp[j];
                if(A[i-1]==B[j-1])
                    dp[j]=prev;
                else
                    dp[j]=min(prev+c2,min(dp[j]+c1,dp[j-1]+c0));
                prev=tmp;
            }
        }
        return dp[m];
    }
};