• 算法第三章上机实验报告


    实践题目
     
    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)

     

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

    算法描述:

    如果a[i]==b[j]那么dp[i][j] 的答案就是 dp[i-1][j-1]
    如果a[i]!=b[j] 那么dp[i][j] 的答案将会是,
    删除a[i]: 1+dp[i-1][j], 删除b[j]: 1+dp[i][j] , 修改a[i] 使 a[i]==b[j]: 1+dp[i-1][j-1]
    这三个操作中答案最小的那个

    #include<iostream>
    #include<cstring>
    
    using namespace std;
    
    char a[2100],b[2100];
    
    int dp[2100][2100];
    
    int main() {
        cin >> a + 1 >> b + 1;
        int alen = strlen (a + 1);
        int blen = strlen (b + 1);
        
        for(int i = 1; i <= alen; i ++) dp[i][0] = i;    
        for(int i = 1; i <= blen; i ++) dp[0][i] = i;
        
        for(int i = 1; i <= alen; i ++) {
            for(int j = 1; j <= blen; 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[alen][blen];
        return 0;
    } 
    View Code

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

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

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

    心得体会:动态规划最重要的还是要写出递归方程,填表法需要反复借用状态转移方程来求未知量

  • 相关阅读:
    Steady Cow Assignment POJ
    二分图多重匹配问题
    Tour HDU
    奔小康赚大钱 HDU
    Strategic Game HDU
    Antenna Placement POJ
    Oil Skimming HDU
    Rain on your Parade HDU
    假如,
    这样也可以,insert,,
  • 原文地址:https://www.cnblogs.com/gwpsf/p/11715914.html
Copyright © 2020-2023  润新知