在nowcoder上的题目,原题如下:
对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。
给定两个字符串A和B,及它们的长度和三种操作代价,请返回将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];
}
};