zoukankan      html  css  js  c++  java
  • 【动态规划】编辑距离

    原题传送门
    自己动手敲的第一道二维DP题目(尽管偷偷翻了一下算法书)心情很美丽

    思路


    设dp[i][j]表示X[i]与Y[j]的编辑距离.

    那么,可以进行三种操作:
    插入x[i](等同于删除y[j]),那么dp[i][j]就等于dp[i-1][j]+1.
    插入x[i](等同于删除y[j]),那么dp[i][j]就等于dp[i-1][j]+1.
    将x[i]替换成yj.

    运用贪心,得到状态转移方程为:

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

    剩下的就是混代码了,不再赘述。

    Code


    #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;
    }
    
  • 相关阅读:
    第03组 Alpha冲刺(3/4)
    第03组 Alpha冲刺(2/4)
    第03组 Alpha冲刺(1/4)
    课程总结
    第十四周学习总结&实验报告
    第十三周课程总结
    第十二周学习总结
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
  • 原文地址:https://www.cnblogs.com/gongdakai/p/11031533.html
Copyright © 2011-2022 走看看