最小编辑代价

题目描述

给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。

输入描述:

输出三行,第一行和第二行均为一行字符串,分别表示两个字符串str1,str2。\left( 1\leq length(str1),length(str2) \leq 5000 \right)(1≤length(str1),length(str2)≤5000)。第三行为三个正整数,代表ic,dc和rc。(1<=ic<=10000、1<=dc<=10000、1<=rc<=10000)

输出描述:

输出一个整数,表示编辑的最小代价。

示例1

输入

abc
adc
5 3 2

输出

2

示例2

输入

abc
adc
5 3 100

输出

8

示例3

输入

abc
abc
5 3 2

输出

0
#include<iostream>
#include<string>
#include<vector>

using namespace std;

int minCost(string s1, string s2, int ic, int dc, int rc){
    if(s1.empty() || s2.empty())
        return 0;
    int len1=s1.length();
    int len2=s2.length();
    vector<vector<int> > dp(len1+1, vector<int>(len2+1, 0));
    for(int i=1;i<=len1;++i){
        dp[i][0]=i*dc;
    }
    for(int i=1;i<=len2;++i){
        dp[0][i]=i*ic;
    }
    for(int i=1;i<=len1;++i){
        for(int j=1;j<=len2;++j){
            if(s1[i-1]==s2[j-1]){
                dp[i][j]=dp[i-1][j-1];
            }else{
                dp[i][j]=dp[i-1][j-1]+rc;
            }
            dp[i][j]=min(dp[i][j],dp[i][j-1]+ic);
            dp[i][j]=min(dp[i][j],dp[i-1][j]+dc);
        }
    }
    return dp[len1][len2];
}

int main(){
    string str1, str2;
    cin>>str1>>str2;
    int ic, dc, rc;
    cin>>ic>>dc>>rc;
    cout<<minCost(str1, str2, ic, dc, rc)<<endl;
    return 0;
}

 空间压缩

待填

 

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页