hdu 4323 Magic Number (dp,编辑距离)

链接:hdu 4323

题意:给定n个串和m次询问,对于每次询问,给定一个字符串t,和最大操作次数a,

问在n个字符串中有多少个能在规定的次数之内变成字符串t.

说明:字符串的基本操作仅为:删除、插入和修改一个字符这三种操作

我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作。

两个字符串的编辑距离:两个字符串a和b,通过上述的基本操作,把a变成b或b变成a,

需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离

分析:分别求出n个字符串与字符串t之间的编辑距离,并判断是否不大于最大操作步数

关键点:求编辑距离

设dp[i+1][j+1]:

为第一个字符串长度为i的子串到第二个字符串的长度为j的子串的编辑距离

动态规划公式:

i = 0 且 j = 0,dp[i][j] = 0

i = 0 且 j > 0,dp[i][j] = j

i > 0 且j = 0,dp[i][j] = i

i ≥ 1  且 j ≥ 1 ,dp[i+1][j+1] == min{ dp[i][j+1]+ 1, dp[i+1][j] + 1, dp[i][j] + f(i, j) },

当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,

f(i, j) = 1;否则,f(i, j) = 0

#include<stdio.h>
#include<string.h>
int dp[15][15],len1,len2;
char s[1530][15],t[15];
int min(int a,int b,int c)
{
    if(b<a)
        a=b;
    if(c<a)
        a=c;
    return a;
}
void my_dp(int pos)  //计算字符串s[pos]和t的编辑距离
{
    int i,j,dp1,dp2,dp3;
    len1=strlen(s[pos]);
    len2=strlen(t);
    for(i=0;i<=len1;i++)
        dp[i][0]=i;
    for(j=0;j<=len2;j++)
        dp[0][j]=j;
    for(i=0;i<len1;i++)
        for(j=0;j<len2;j++){
            dp1=dp[i][j+1]+1;
            dp2=dp[i+1][j]+1;
            dp3=dp[i][j];
            if(s[pos][i]!=t[j])
                dp3++;
            dp[i+1][j+1]=min(dp1,dp2,dp3);
        }
}
int main()
{
    int m,n,T,i,k,a,ans;
    scanf("%d",&T);
    for(k=1;k<=T;k++){
        printf("Case #%d:\n",k);
        scanf("%d%d",&m,&n);
        for(i=1;i<=m;i++)
            scanf("%s",s[i]);
        while(n--){
            scanf("%s%d",t,&a);
            ans=0;
            for(i=1;i<=m;i++){
                my_dp(i);
                if(dp[len1][len2]<=a)
                    ans++;
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}
时间: 2024-08-10 21:20:59

hdu 4323 Magic Number (dp,编辑距离)的相关文章

hdu 4323 Magic Number( DP )

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4323 Magic Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1728    Accepted Submission(s): 705 Problem Description There are many magic num

HDU 4323 Magic Number(编辑距离DP)

http://acm.hdu.edu.cn/showproblem.php?pid=4323 题意: 给出n个串和m次询问,每个询问给出一个串和改变次数上限,在不超过这个上限的情况下,n个串中有多少个串可以转化为询问中给的串. 思路: 明显的编辑距离DP,直接暴力过了,网上有用bk树的,可惜我不会. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6

hdu 5125 magic balls(dp)

题目链接:hdu 5125 magic balls #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1005; int N, M, dp[maxn][maxn], A[maxn], B[maxn]; int vec[maxn][maxn], c[maxn]; void init () { scanf("%d%d&quo

HDU 5125 Magic Ball DP+树状数组

由于只要找1~x 中的最大值,然后线段树又容易MLE,所以这里可以用树状数组搞. #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <set> #include <bitset> #include <queue> #include <stack> #include <string> #i

hdu 3006 The Number of set(思维+壮压DP)

The Number of set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1056    Accepted Submission(s): 655 Problem Description Given you n sets.All positive integers in sets are not less than 1 and

hdu 5787 K-wolf Number 数位dp

数位DP 神模板 详解 为了方便自己参看,我把代码复制过来吧 // pos = 当前处理的位置(一般从高位到低位) // pre = 上一个位的数字(更高的那一位) // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, // 给计数器+1. // limit = 是否受限,也即当前处理这位能否随便取值.如567,当前处理6这位, // 如果前面取的是4,则当前这位可以取0-9.如果前面取的5,那么当前 // 这位就不能随便取,不然会超出这个数的范围,所以如果前面取

hdu 3709 Balanced Number (数位dp)

Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 1871    Accepted Submission(s): 836 Problem Description A balanced number is a non-negative integer that can be balanced if a pi

HDU 3709 Balanced Number 枚举+数位DP

枚举支点之后数位DP,注意姿势 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list&g

Magic Number(Levenshtein distance算法)

Magic Number Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4323 Description There are many magic numbers whose lengths are less than 10. Given some queries, each contains a single number, if t