三个算法题,其中两个是填空形式。一个是编程,字符串变换的最小费用,不过没有自动的测试用例,只能自己输入
题目:
让字符串s1转换为s2,有三种操作分别为插入ic,删除dc,改变rc,分别对应不同的费用,求转换字符串的最小费用
例子:
s1:“abc”
s2:“adc”
ic = 3
dc = 5
rc = 99
这时候先删除b然后插入d费用最小,为8.
思路:二维dp ,dp[i][j]表示从s1前i个字符调整到s2前j个字符的费用
代码
int main(){
/* 让字符串s1转换为s2,有三种操作分别为插入ic,删除dc,改变rc,分别对应不同的费用,求转换字符串的最小费用*/
string s1 = "abc";
string s2 = "adc";
int ic = 3;
int dc = 5;
int rc = 99;
int len1 = s1.size();
int len2 = s2.size();
vector<vector<int>> dp(len1+1,vector<int>(len2+1));//dp[i][j]表示从s1前i个字符调整到s2前j个字符的费用
//源字符串为空
for(int i=1;i<=len2;i++){
dp[0][i] = i*ic;
}
//目标字符串为空
for(int j = 1;j<=len1;j++){
dp[j][0] = j*dc;
}
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
if(s1[i] == s2[j]){
dp[i+1][j+1] = dp[i][j];
}else{
dp[i+1][j+1] = min(min(dp[i+1][j] + ic,dp[i][j+1] + dc),dp[i][j]+rc);
//dp[i+1][j] + ic对应了s1先删除一个到 再插入一个的费用
//dp[i][j+1] + dc对应了s1先插入一个到 再删除一个的费用
//dp[i][j]+rc 对应了直接改变一个字符的费用
}
}
}
cout << dp[len1][len2];
return 0;
}