洛谷——P2758 编辑距离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷——P2758 编辑距离相关的知识,希望对你有一定的参考价值。

P2758 编辑距离

题目描述

设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

1、删除一个字符;

2、插入一个字符;

3、将一个字符改为另一个字符;

!皆为小写字母!

输入输出格式

输入格式:

 

第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。

 

输出格式:

 

只有一个正整数,为最少字符操作次数。

 

输入输出样例

输入样例#1: 复制
sfdqxbw
gfdgw
输出样例#1: 复制
4

 

 

dp

我们用f[i][j]表示a字符串匹配到第i位,b字符串中匹配到第j位的最少的操作次数

如果当前的a字符串的位上的数与b上的数相等,那么最少的操作数就还是上面的

反之,如果不相等,那么我们肯定会执行删除一个字符;插入一个字符;将一个字符改为另一个字符;中的任意一个,这个时候我们就要去个最小值了,所以操作数+1

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 2100
using namespace std;
char a[N],b[N];
int l1,l2,f[N][N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
int main()
{
    cin>>a+1>>b+1;
    l1=strlen(a+1),l2=strlen(b+1);
    for(int i=1;i<=l1;i++)
     f[i][0]=i;
    for(int i=1;i<=l2;i++)
     f[0][i]=i;
    for(int i=1;i<=l1;i++)
     for(int j=1;j<=l2;j++)
      if(a[i]==b[j]) f[i][j]=f[i-1][j-1];
      else f[i][j]=min(f[i][j-1],min(f[i-1][j],f[i-1][j-1]))+1;
    printf("%d",f[l1][l2]);
    return 0;
}

 

以上是关于洛谷——P2758 编辑距离的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P2758 编辑距离

洛谷 P2758 编辑距离 dp

[LuoGu] P2758 编辑距离

P2758 编辑距离 简单DP

洛谷 2758 编辑距离

洛谷P1279 字串距离