P2758 编辑距离

题目描述

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

1、删除一个字符;

2、插入一个字符;

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

!皆为小写字母!

输入输出格式

输入格式:

 

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

 

输出格式:

 

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

 

输入输出样例

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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 2147483647
const ll INF = 0x3f3f3f3f3f3f3f3fll;
#define ri register int
template <class T> inline T min(T a, T b, T c)
{
    return min(min(a, b), c);
}
template <class T> inline T max(T a, T b, T c)
{
    return max(max(a, b), c);
}
template <class T> inline T min(T a, T b, T c, T d)
{
    return min(min(a, b), min(c, d));
}
template <class T> inline T max(T a, T b, T c, T d)
{
    return max(max(a, b), max(c, d));
}
#define scanf1(x) scanf("%d", &x)
#define scanf2(x, y) scanf("%d%d", &x, &y)
#define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define scanf4(x, y, z, X) scanf("%d%d%d%d", &x, &y, &z, &X)
#define pi acos(-1)
#define me(x, y) memset(x, y, sizeof(x));
#define For(i, a, b) for (int i = a; i <= b; i++)
#define FFor(i, a, b) for (int i = a; i >= b; i--)
#define bug printf("***********\n");
#define mp make_pair
#define pb push_back
const int maxn = 10005;
// name*******************************
string s1,s2;
int l1,l2;
int ans=inf;
int f[2005][2005];

// function******************************



//***************************************
int main()
{
//    ios::sync_with_stdio(0);
//    cin.tie(0);
//    freopen("test.txt", "r", stdin);
    //  freopen("outout.txt","w",stdout);
    cin>>s1>>s2;
    l1=s1.size(),l2=s2.size();
    me(f,127);
    For(i,0,max(l1,l2))
    f[0][i]=i,f[i][0]=i;
    For(i,1,l1)
    {
        For(j,1,l2)
        {
            if(s1[i-1]==s2[j-1])f[i][j]=f[i-1][j-1];
            else f[i][j]=min(f[i-1][j],f[i][j-1],f[i-1][j-1])+1;
//            cout<<i<<","<<j<<":"<<f[i][j]<<endl;
        }
    }
cout<<f[l1][l2];

    return 0;
}

 

posted @ 2018-03-22 22:38  planche  阅读(209)  评论(0编辑  收藏  举报