最小編輯代價

砍柴人Ryan發表於2020-11-26

題目描述

給定兩個字串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;
}

 空間壓縮

待填

 

 

 

 

相關文章