您的位置:首页 > 其它

hdu 4323 编辑距离(经典) 动态规划

2013-08-12 10:12 239 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4323

题目大意:给出n个字符串s1[1-n];,再给出m个 字符串和编辑距离临界值s2[1-m],kk[1-m],依次求这m个字符串与n个字符串的编辑距离小于编辑距离临界值的个数。即:s2[i]与s1[1-n]的编辑距离小于kk[i]的个数 (1<=i<=m).

注意:kk[i]的值较小,对于判断很有用,因为若字符串长度差大于kk,编辑距离必定大于kk[i];

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int dp[20][20];
char s1[1501][20];
char s2[20];
int len[1501];
int min(int a,int b,int c)
{
int q=a;
if(b<q)
q=b;
if(c<q)
q=c;
return q;
}
int main()
{
int T,n,m,kk;
int i,j,k;
int sum,ans,len1,cas=0;
scanf("%d",&T);
while(T--)
{
memset(len,0,sizeof(len));
cas++;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%s",s1[i]+1);
len[i]=strlen(s1[i]+1);
}
printf("Case #%d:\n",cas);
for(int k1=1;k1<=m;k1++)
{
sum=0;
scanf("%s%d",s2+1,&kk);
len1=strlen(s2+1);
for(int k2=1;k2<=n;k2++)
{
if(abs(len1-len[k2])>kk) //重要的判断
continue;
memset(dp,0,sizeof(dp));
for(i=0;i<=len1;i++)
dp[i][0]=i;
for(j=0;j<=len[k2];j++)
dp[0][j]=j;
for(i=1;i<=len1;i++)
{
for(j=1;j<=len[k2];j++)
{
int cost;
if(s2[i]==s1[k2][j])
cost=0;
else
cost=1;
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+cost);
// dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);
//dp[i][j]=min(dp[i][j],dp[i-1][j-1]+cost);
}
}
if(dp[len1][len[k2]]<=kk)
sum++;
}
printf("%d\n",sum);
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: