编辑距离 poj3356
采用动态规划的思想,对子问题的最优解进行备份,自底向上边在递归式中直接调用备份解。
#include<iostream>
#include<string>
using namespace std;
int L[1001][1001];//备份的二维数组
int a,b,c;
void LED(int m, int n, string x, string y)//生成最优解的函数
{
for(int i=0;i<m+1;i++)
{
L[i][0] = i;
}//当一个x字符串为0时,最小编辑距离为y字符串的长度
for(int i=0;i<n+1;i++)
{
L[0][i] = i;
}}//当一个y字符串为0时,最小编辑距离为x字符串的长度
for(int i=1;i<m+1;i++)
{
for(int j=1;j<n+1;j++)
{
a = L[i-1][j] + 1;//case1:删掉X[i]
b = L[i][j-1] + 1;//case2:添加X[i+1]
c = L[i-1][j-1] + (x[i] == y[j] ? 0:1);
//case3:改变x[i],其中若X[i]==y[i]则赋0,否则赋1
L[i][j] = min(c,min(a,b));//L[i][j]为最小的一个
}
}
}
int main()
{
int m,n;
string x,y;
while(cin >> m >> x)
{
cin >> n >> y;
memset(L,0,sizeof(L));
//对x,y进行预处理,使得X[i]为字符串的第i个元素,使得算法易于理解。
x = " "+x;
y = " "+y;
LED(m,n,x,y);
cout << L[m][n] << endl;
}
}