HDU 4323 Magic Number(DP)

题目链接

先是经典的DP,敲的不熟啊,很久没打了吗?初始化都忘了,调试了会,然后过了样例各种WA,不过也应该,那次多校完,就听说是编辑距离,就按照等于算的,看了下题解是小于等于,越来越不愿意看题了。

 1 #include <stdio.h>
 2 #include < string.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5  #define N 100000000
 6  int min( int x, int y, int z)
 7 {
 8      int q;
 9     q = x;
10      if(q > y)
11         q = y;
12      if(q > z)
13         q = z;
14      return q;
15 }
16  char p[ 1501][ 11],str[ 11];
17  int num[ 1501],o[ 11][ 11];
18  int main()
19 {
20      int t,n,m,i,j,nu =  0,x,key,len;
21      int a,b;
22     scanf( " %d ",&t);
23      while(t--)
24     {
25         nu ++;
26         memset(p, 0, sizeof(p));
27         memset(str, 0, sizeof(str));
28         memset(num, 0, sizeof(num));
29         scanf( " %d%d%*c ",&n,&m);
30          for(i =  1; i <= n; i ++)
31         {
32             gets(p[i]);
33             num[i] = strlen(p[i]);
34         }
35         printf( " Case #%d:\n ",nu);
36          for(i =  1; i <= m; i ++)
37         {
38             scanf( " %s%d ",str,&x);
39             key =  0;
40             len = strlen(str);
41              for(j =  1; j <= n; j ++)
42             {
43                 memset(o, 0, sizeof(o));
44                  if(abs(len-num[j]) > x)
45                  continue;
46                  for(a =  1; a <= len; a ++)
47                 o[a][ 0] = a;
48                  for(a =  1;a <= num[j];a ++)
49                 o[ 0][a] = a;
50                  for(a =  1; a <= len; a ++)
51                 {
52                      for(b =  1; b <= num[j]; b ++)
53                     {
54                          if(str[a- 1] == p[j][b- 1])
55                         o[a][b] = o[a- 1][b- 1];
56                          else
57                         o[a][b] = min(o[a- 1][b- 1]+ 1,o[a- 1][b]+ 1,o[a][b- 1]+ 1);
58                     }
59                 }
60                  if(o[len][num[j]] <= x)
61                     key ++;
62             }
63             printf( " %d\n ",key);
64         }
65     }
66      return  0;
67 } 

 

转载于:https://www.cnblogs.com/naix-x/archive/2012/08/12/2634843.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值