zoukankan      html  css  js  c++  java
  • 算法第三章上机实践报告

    实践题目
     
    7-3 编辑距离问题 (30 分)

    设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。

    输入格式:

    第一行是字符串A,文件的第二行是字符串B。

    提示:字符串长度不超过2000个字符。

    输出格式:

    输出编辑距离d(A,B)

    输入样例:

    在这里给出一组输入。例如:

    fxpimu
    xwrs 
    

    输出样例:

    在这里给出相应的输出。例如:

    5

    问题描述:
      给出两个字符串求最短编辑距离。

    算法描述:
      定义dp【i】【j】:第一个字符串下标1到i的部分和第二个字符串下标1到j的部分的最短编辑距离(下标从1开始)。所以dp【第一个字符串长度】【第二个字符串长度】即为答案。
      初始化dp【i】【0】 = i(i∈【1,第一个字符串长度】),dp【0】【j】 = j(j∈【1,第二个字符串长度】)
      当第一个字符串取区间【1,i】,第二个串取空串时,显然要删除第一个串的i个字符使得两串相同,
      当第二个字符串取区间【1,j】,第一个串取空串时,显然要添加j个第二个串的字符使得两串相同。
      
      之后就是填表,定义两个变量i和j分别指向第一个串和第二个串,表示考虑一串(A)的第i个字符和二串(B)的第j个字符
      当A【i】 == B【j】的时候,显然dp【i】【j】 = dp【i - 1】【j - 1】;(想一下dp的定义)
      当A【i】 != B【j】的时候,
       ①已知A【1....i-1】和B【1....j】的最短编辑距离,考虑A的第i个字符,应该删除该字符使两串相同
       ②已知A【1....i】和B【1....j-1】的最短编辑距离,考虑B的第j个字符,应在A后面添加B的第j个字符使得两串相同
       ③已知A【1...i-1】和B【1....j-1】的最短编辑距离,考虑A【i】和B【j】,应把A【i】改成B【j】使得两串相同
       所以得到递推公式:dp【i】【j】 = min(dp【i-1】【j】,dp【i】【j-1】,dp【i-1】【j-1】)+ 1
      参考代码(不要随便开全局变量!!!):

    #include <iostream>
    #include <string.h>
    using namespace std;
    const int maxn = 2000 + 100;
    int dp[maxn][maxn];
    char a[maxn],b[maxn];
    int main() {
        cin >> a + 1 >> b + 1;
        int lena = strlen(a+1);
        int lenb = strlen(b+1);
        for (int i=1; i<=lena; ++i) dp[i][0] = i;
        for (int i=1; i<=lenb; ++i) dp[0][i] = i;
        for (int i=1; i<=lena; ++i) {
            for (int j=1; j<=lenb; ++j) {
                if(a[i] == b[j]) dp[i][j] = dp[i-1][j-1];
                else dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1])) + 1;
            }
        }
        cout << dp[lena][lenb];
        return 0;
    }
    View Code

       

    算法时间及空间复杂度分析

      时间复杂度:该算法是填表法,所以时间复杂度是O(m*n)

       空间复杂度:没有额外开销,所以空间复杂度是O(1)

      

    心得体会

      做动态规划的题目最重要的是要推出递推方程,以及定义dp的含义和确定dp的上界,有时候还要自己定义dp的状态(个人感觉)。

        

  • 相关阅读:
    Error Correct System(模拟)
    Pasha and String(思维,技巧)
    Vitaliy and Pie(模拟)
    Old Sorting(转化成单调序列的最小次数,置换群思想)
    Segment(技巧 相乘转换成相加 + java)
    Conquering Keokradong && Get the Containers(二分)
    Handshakes(思维) 2016(暴力)
    Dice Notation(模拟)
    “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛暨河南高校邀请赛-正式赛(总结)
    MySQL安装-二进制软件包安装
  • 原文地址:https://www.cnblogs.com/Remilia-Scarlet/p/11694493.html
Copyright © 2011-2022 走看看