题意:给你n个数,m个查询,查询中包括一个数和一个最大编辑距离d,问n个数中和这个数的编辑距离不超过d的有多少个
编辑距离:http://baike.baidu.com/view/2020247.htm?from_id=792226&type=syn&fromtitle=Levenshtein+Distance&fr=aladdin
思路:设dp[i][j]为数字a前i个数和数字b前j个数的编辑距离
则dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1+1,dp[i-1][j-1]+cost)
交一发,T了,这里有个小小的优化,若两个数的长度之差大于最大编辑距离d,则不必再求他们之间的编辑距离
代码
1 #include "stdio.h" 2 #include "string.h" 3 #include "stdlib.h" 4 #include "math.h" 5 #define INF 1000 6 char a[1511][11],b[11]; 7 int dp[20][20]; 8 int min(int a,int b) 9 { 10 return a<b?a:b; 11 } 12 void debug(int len1,int len2) 13 { 14 int i,j; 15 for(i=1;i<=len1;i++) 16 {for(j=1;j<=len2;j++) 17 printf("%d ",dp[i][j]); 18 printf(" "); 19 } 20 } 21 int slove(char a[],char b[]) 22 { 23 int len1,len2; 24 int i,j; 25 int cost; 26 len1=strlen(a); 27 len2=strlen(b); 28 memset(dp,0,sizeof(dp)); 29 for(i=0;i<len1;i++) 30 dp[i+1][0]=i+1; 31 for(i=0;i<len2;i++) 32 dp[0][i+1]=i+1; 33 for(i=0;i<len1;i++) 34 { 35 for(j=0;j<len2;j++) 36 { 37 if(a[i]==b[j]) 38 cost=0; 39 else 40 cost=1; 41 dp[i+1][j+1]=min(dp[i][j+1]+1,dp[i+1][j]+1); 42 dp[i+1][j+1]=min(dp[i][j]+cost,dp[i+1][j+1]); 43 } 44 } 45 //printf("%s %s: ",a,b); 46 //debug(len1,len2); 47 return dp[len1][len2]; 48 } 49 int main() 50 { 51 int n,m; 52 int t; 53 int i,j; 54 int d,cas=0; 55 int ans; 56 int len1,len2; 57 scanf("%d",&t); 58 while(t--) 59 { 60 cas++; 61 printf("Case #%d: ",cas); 62 scanf("%d%d",&n,&m); 63 for(i=0;i<n;i++) 64 scanf("%s",a[i]); 65 while(m--) 66 { 67 ans=0; 68 scanf("%s%d",b,&d); 69 for(j=0;j<n;j++) 70 { 71 len1=strlen(a[j]); 72 len2=strlen(b); 73 if(abs(len1-len2)>d) 74 continue; 75 if(slove(a[j],b)<=d) 76 ans++; 77 } 78 printf("%d ",ans); 79 } 80 } 81 return 0; 82 }