hdoj 4323

题意:给你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("\n");
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:\n",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:\n",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\n",ans);
79         }
80     }
81     return 0;
82 }
View Code

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值