码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷——P2758 编辑距离

时间:2017-11-25 20:42:13      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:pre   整数   ace   复制   mes   编辑   cin   style   删除   

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 编辑距离

标签:pre   整数   ace   复制   mes   编辑   cin   style   删除   

原文地址:http://www.cnblogs.com/z360/p/7896207.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!