TOJ1072编辑距离

编辑距离 分享至QQ空间 去爱问答提问或回答

Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByte
Total Submit: 692            Accepted: 217

Description

假设字符串的基本操作仅为:删除一个字符、插入一个字符和将一个字符修改成另一个字符这三种操作。 
我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作。 
下面我们定义两个字符串的编辑距离:对于两个字符串a和b,通过上述的基本操作,我们可以把a变成b或b变成a,那么字符串a变成字符串b需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离。 
例如:a="ABC",b="CBCD",则a与b的编辑距离为2。 
你的任务就是:编一个快速的程序来计算任意两个字符串的编辑距离。

Input

输入包含多组测试数据。每组测试数据一行,为字符串A和字符串B。 
字符串的长度不大于1024,且全为字母。

Output

编辑距离。

Sample Input

ABC CBCD

Sample Output

2


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cstdlib>
using namespace std;
const int maxn = 1100;
const int INF = 0x7fffffff;
char A[maxn];
char B[maxn];
int d[maxn][maxn];

void dp(int m, int n) {
    int i, j;
    int ans;
    d[0][0] = 0;
    for(i = 1; i <= m; i++) d[i][0] = i;
    for(j = 1; j <= n; j++) d[0][j] = j;
    for(i = 1; i <= m; i++) {
        for(j = 1; j <= n; j++) {
            ans = d[i][j] = INF;
            int it = 0;
            if(A[i]==B[j]) it = 0;
            else it = 1;
            ans = min(ans, d[i-1][j-1] + it);
            ans = min(ans, d[i-1][j]+1);
            ans = min(ans, d[i][j-1]+1);
            d[i][j] = ans;
        }
    }
}

int main()
{
    A[0] = 'a', B[0] = 'a';
    int m, n;
    while(scanf("%s%s", A+1, B+1) != EOF) {
        m = strlen(A) - 1;
        n = strlen(B) - 1;
        dp(m, n);
        printf("%d\n", d[m][n]);
    }
    return 0;
}

Source

ZJGSU

你可能感兴趣的:(TOJ1072编辑距离)