//============================================================================ // Name : 3计算字符的相似度.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> using namespace std; const int MAX=10000; int compute(int *a,int *b,int lengtha,int lengthb) { if(lengtha<=0||lengthb<=0) return 0; int min=MAX; if(a[lengtha]==b[lengthb]) { int min1=compute(a,b, lengtha-1,lengthb)+1; int min2=compute(a,b, lengtha,lengthb-1)+1; int min3=compute(a,b, lengtha-1,lengthb-1); if(min>min1) min=min1; if(min>min2) min=min2; if(min>min3) min=min3; } else { int min1=compute(a,b, lengtha-1,lengthb)+1; int min2=compute(a,b, lengtha,lengthb-1)+1; int min3=compute(a,b, lengtha-1,lengthb-1)+1; if(min>min1) min=min1; if(min>min2) min=min2; if(min>min3) min=min3; } cout<<"min is " <<min<<endl; return min; } int f[100][100]; int compute1(int *a,int *b,int lengtha,int lengthb) { for(int i=0;i<=lengtha;i++) { for(int j=0;j<=lengthb;j++) { f[i][j]=MAX; } } f[0][0]=0; for(int i=1;i<=lengtha;i++) { for(int j=1;j<=lengthb;j++) { if(a[i]==b[j]) { if(f[i][j]>f[i-1][j-1]) f[i][j]=f[i-1][j-1]; if(f[i][j]>f[i][j-1]+1) f[i][j]=f[i][j-1]+1; if(f[i][j]>f[i-1][j]+1) f[i][j]=f[i-1][j]+1; } else if(a[i]!=b[j]) { if(f[i][j]>f[i-1][j-1]+1) f[i][j]=f[i-1][j-1]+1; if(f[i][j]>f[i][j-1]+1) f[i][j]=f[i][j-1]+1; if(f[i][j]>f[i-1][j]+1) f[i][j]=f[i-1][j]+1; } cout<<"f["<<i<<"]["<<j<<"]="<<f[i][j]<<endl; } } return f[lengtha][lengthb]; } int main() { int a[]={-1,1,2,3,4,5,6,7}; int b[]={-2,1,2,3,4,5,6}; int lengtha=7; int lengthb=6; cout <<compute1(a,b,lengtha,lengthb)<< endl; return 0; }