最小编辑代价(动态规划)

在nowcoder上的题目,原题如下:

对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。

给定两个字符串AB,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。

保证两串长度均小于等于300,且三种代价值均小于等于100。

测试样例:
"abc",3,"adc",3,5,3,100
返回:8

刚开始WA,还觉得样例有问题,明明可以删掉'b'和'd',代价为6啊,后来才想到”将A串变为B串“,我们对B串是不能进行操作的

class MinCost {
public:
    int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) {
        //f[i][j] represent the cost to edit A[i, n) to B[j, m)
        vector<vector<int>> f(n+1, vector<int>(m+1));
        //try to let A[n, n) to match B[m, m), just null to null
        f[n][m] = 0;
        for(int i = 0; i < n; ++i){
            //try to let A[i, n) to match B[m, m), have to delete all
            f[i][m] = (n-i) * c1;
        }
        for(int j = 0; j < m; ++j){
            //try to let A[n, n) to match B[j, m), have to insert all
            f[n][j] = (m-j) * c0;
        }
        for(int i = n-1; i > -1; --i){
            for(int j = m-1; j > -1; --j){
                if(A[i] == B[j]) f[i][j] = f[i+1][j+1];
                else{
                    //try to let A[i+1,n) match B[j,m), operation is delete A[i]
                    f[i][j] = f[i+1][j] + c1;
                    //try to let A[i,n) match B[j+1,m), operation is insert B[j]
                    f[i][j] = min(f[i][j], f[i][j+1] + c0);
                    //try to make A[i] equal to B[j]
                    if(c0 + c1 < c2){
                        //better way is delete then insert
                        f[i][j] = min(f[i][j], f[i+1][j+1] + c0 + c1);
                    }
                    else{
                        //better way is replace A[i] by B[j]
                        f[i][j] = min(f[i][j], f[i+1][j+1] + c2);
                    }
                }
            }
        }
        return f[0][0];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值