zoukankan      html  css  js  c++  java
  • 蒜头君的秘密文件(编辑距离)

    每个人都有点秘密,蒜头君也不例外,他把秘密记在一个小本上,并且留有备份,不过第一个本的内容被人破坏掉了,跟原来不一定相同了,他现在想要照着第二个本把第一个本的内容还原,每一次做一个操作,一个操作可以是在某位置增加一个字符,删掉某个字符,或者把某个位置的字符改成另一个字符,他想知道他最少需要进行多少次操作才能把第一个本的内容还原。

    输入格式

    第一行一个字符串A,表示第一个本被破坏之后的字符串。

    第二行一个字符串B,表示第二个本上面的字符串。

    字符串均仅有小写字母组成且长度均不超过1000。

    输出格式

    输出一个整数,为蒜头君最少要做的操作数。

    样例输入

    aa
    ab

    样例输出

    1 

    这道题就是求由A串变为B串的编辑距离,按照编辑距离的状态转移方程进行转移就可以了。

    参考另一篇博客https://www.cnblogs.com/jiamian/p/12203580.html

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <math.h>
     6 #include <algorithm>
     7 #include <vector>
     8 #include <stack>
     9 #include <queue>
    10 #include <set>
    11 #include <map>
    12 #include <sstream>
    13 const int INF=0x3f3f3f3f;
    14 typedef long long LL;
    15 const int maxn=1e5+10;
    16 using namespace std;
    17 
    18 char a[1005];
    19 char b[1005];
    20 int dp[1005][1005];
    21 
    22 int main()
    23 {
    24     scanf("%s %s",a,b);
    25     for(int i=1;i<=strlen(a);i++)
    26         dp[i][0]=i;
    27     for(int i=1;i<=strlen(b);i++)
    28         dp[0][i]=i;
    29     for(int i=1;i<=strlen(a);i++)
    30     {
    31         for(int j=1;j<=strlen(b);j++)
    32         {
    33             if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1];
    34             else dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
    35         }
    36     }
    37     printf("%d
    ",dp[strlen(a)][strlen(b)]);
    38     return 0;
    39 }

    -

  • 相关阅读:
    oracle误操作commit之后,可以闪回数据
    删除表中重复数据,只保留一条数据
    去掉表中字段空的空格或换行符
    oracle主键自增
    List
    Collection Iterator 迭代器
    oracle 处理表的一列
    java swing
    oracle 常用函数大全
    cf 40A
  • 原文地址:https://www.cnblogs.com/jiamian/p/12208007.html
Copyright © 2011-2022 走看看