[編集]羅区距離

ポータル原題
自身は、二次元DPのタイトルの最初の行をノック(密かにビット演算ブックになっているが)私は非常に美しいと感じ

考え

提供DP [i] [j]はX [i]との編集距離Y [j]を表します。

次いで、3つのアクションを実行することができる:
挿入X [I](Y [j]を削除に相当)、次にDP [i] [j]は[I-1]〜[J DPに等しい ] +1。
Xを挿入する[I] (Y [j]を削除に相当)、次にDP [I] [j]はDPに等しい[I-1]〜[J ] +1。
X [i]は、Y置換されJを

貪欲の使用は、状態遷移方程式が得られます。

dp[i][j]=min{dp[i-1][j]+1,dp[i-1][j]+1,dp[i-1][j-1]+(x[i]!=y[j])}

残りは、コードの混在で、それらを繰り返しません。

コード

#include<iostream>
#include<string>
using namespace std;

string A,B;
int dp[2001][2001];

int min(int a,int b,int c)
{
    if(a<=b&&a<=c)
        return a;
    if(b<=a&&b<=c)
        return b;
    if(c<=a&&c<=b)
        return c;
}

int main()
{
    //freopen("testdata.in","r",stdin);
    cin>>A>>B;
    for(int i=1;i<=A.size();i++)
    {
        dp[i][0]=i;
    }
    for(int j=1;j<=B.size();j++)
    {
        dp[0][j]=j;
    }
    for(int i=1;i<=A.size();i++)
    {
        for(int j=1;j<=B.size();j++)
        {
            dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+(A[i-1]!=B[j-1]));
        }
    }
    /*
    生成DP表格以便调试 
    cout<<" "<<B<<endl;
    for(int i1=1;i1<=A.size();i1++)
    {    
        cout<<A[i1-1];
        for(int j1=1;j1<=B.size();j1++)
        {
            cout<<dp[i1][j1];
        }
        cout<<endl;
    }
    cout<<endl;    
    */    
    cout<<dp[A.size()][B.size()];
    return 0;
}

おすすめ

転載: www.cnblogs.com/gongkai/p/11031533.html