#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int MinValue(int a,int b,int c)
{
	int min=a;
	if(b<min)
		min=b;
	if(c<min)
		min=c;
	return min;
}
int Distance(string strA,int pABegin,int pAEnd,
						string strB,int pBBegin,int pBEnd)
{
	if(pABegin>pAEnd)
	{
		if(pBBegin>pBEnd)
			return 0;
		else
			return pBEnd-pABegin+1;
	}
	if(pBBegin>pBEnd)
	{
		if(pABegin>pAEnd)
			return 0;
		else
			return pAEnd-pABegin+1;
	}
	if(strA[pABegin]==strB[pBBegin])
		return Distance(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
	else
	{
		int t1=Distance(strA,pABegin+1,pAEnd,strB,pBBegin,pBEnd);
		int t2=Distance(strA,pABegin,pAEnd,strB,pBBegin+1,pBEnd);
		int t3=Distance(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
		return MinValue(t1,t2,t3)+1;
	}
}
int main(int argc,char *argv[])
{
	string strA,strB;
	cin>>strA;
	cin>>strB;
	int ans=Distance(strA,0,strA.length()-1,strB,0,strB.length()-1);
	cout<<ans<<endl;
}
| j | ||||
| C(i-1,j-1) | C(i-1,j) | |||
| i | C(i,j-1) | C(i,j) | ||
#include<iostream>
#include<string>
#include<algorithm>
#define MAX 1000
using namespace std;
int dp[MAX][MAX];
int MinValue(int a,int b,int c)
{
	int min=a;
	if(b<min)
		min=b;
	if(c<min)
		min=c;
	return min;
}
int Distance(string strA,string strB)
{
	int i,j;
	int lenA=strA.length()+1;
	int lenB=strB.length()+1;
	for(i=0;i<lenA;i++)
		dp[i][0]=i;
	for(j=0;j<lenB;j++)
		dp[0][j]=j;
	dp[0][0]=0;
	for(i=1;i<lenA;i++)
	{
		for(j=1;j<lenB;j++)
		{
			if(strA[i-1]==strB[j-1])
				dp[i][j]=dp[i-1][j-1];
			else
				dp[i][j]=MinValue(dp[i][j-1],dp[i-1][j],dp[i-1][j-1])+1;
		}
	}
	return dp[lenA-1][lenB-1];
}
int main(int argc,char *argv[])
{
	string strA,strB;
	cin>>strA;
	cin>>strB;
	int ans=Distance(strA,strB);
	cout<<ans<<endl;
}
#include<iostream>
#include<string>
#include<algorithm>
#define MAX 1000
using namespace std;
int dis[MAX][MAX];
int MinValue(int a,int b,int c)
{
	int min=a;
	if(b<min)
		min=b;
	if(c<min)
		min=c;
	return min;
}
int Distance(string strA,int pABegin,int pAEnd,
						string strB,int pBBegin,int pBEnd)
{
	if(dis[pABegin][pBBegin]>=0)
		return dis[pABegin][pBBegin];
	if(pABegin>pAEnd)
	{
		if(pBBegin>pBEnd)
			dis[pABegin][pBBegin]=0;
		else
			dis[pABegin][pBBegin]=pBEnd-pABegin+1;
		return dis[pABegin][pBBegin];
	}
	if(pBBegin>pBEnd)
	{
		if(pABegin>pAEnd)
			dis[pABegin][pBBegin]=0;
		else
			dis[pABegin][pBBegin]=pAEnd-pABegin+1;
		return dis[pABegin][pBBegin];
	}
	if(strA[pABegin]==strB[pBBegin])
	{
		dis[pABegin][pBBegin]=Distance(strA,pABegin+1,pAEnd,
		                                         strB,pBBegin+1,pBEnd);
		return dis[pABegin][pBBegin];
	}
	else
	{
		int t1=Distance(strA,pABegin+1,pAEnd,strB,pBBegin,pBEnd);
		int t2=Distance(strA,pABegin,pAEnd,strB,pBBegin+1,pBEnd);
		int t3=Distance(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
		dis[pABegin][pBBegin]=MinValue(t1,t2,t3)+1;
		return dis[pABegin][pBBegin];
	}
}
int main(int argc,char *argv[])
{
	int i,j;
	string strA,strB;
	cin>>strA;
	cin>>strB;
	for(i=0;i<MAX;i++)
		for(j=0;j<MAX;j++)
			dis[i][j]=-1;
	int ans=Distance(strA,0,strA.length()-1,strB,0,strB.length()-1);
	cout<<ans<<endl;
}
原文地址:http://blog.csdn.net/cstopcoder/article/details/26747181