zoukankan      html  css  js  c++  java
  • 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("
    ");
    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 }
    View Code
  • 相关阅读:
    机器学习的定义和分类
    选股
    mysql修改密码
    快速排序
    php的错误类型
    MySQL数据库优化
    库存超卖问题
    循环处理
    kafka安装配置
    JavaScript、jQuery杂记
  • 原文地址:https://www.cnblogs.com/Blundering-Chen/p/3981369.html
Copyright © 2011-2022 走看看