编辑距离

Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte
Total Submit: 692 Accepted: 217
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