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 int n, m;
 7 char s[1505][1005];
 8 char tmp[1005];
 9 int dp[1005][1005];
10
11 int main()
12 {
13     //freopen("in.txt","r",stdin);
14     int T;
15     int kase = 0;
16     scanf("%d",&T);
17     while(T--)
18     {
19         scanf("%d%d",&n,&m);
20         for(int i=1;i<=n;i++)   scanf("%s",s[i]);
21         printf("Case #%d:\n",++kase);
22         while(m--)
23         {
24             int ans = 0;
25             int x; scanf("%s%d",tmp,&x);
26             for(int t=1;t<=n;t++)
27             {
28                 int n1 = strlen(s[t]);
29                 int n2 = strlen(tmp);
30                 for(int i=0;i<=n1;i++)  dp[i][0] = i;
31                 for(int i=0;i<=n2;i++)  dp[0][i] = i;
32                 for(int i=1;i<=n1;i++)
33                 for(int j=1;j<=n2;j++)
34                 {
35                     dp[i][j] = min(dp[i-1][j],dp[i][j-1])+1;
36                     dp[i][j] = min(dp[i][j],dp[i-1][j-1]+(s[t][i-1]!=tmp[j-1]));
37                 }
38                 if(dp[n1][n2]<=x)  ans++;
39             }
40             printf("%d\n",ans);
41         }
42     }
43     return 0;
44 }
时间: 2024-10-23 06:08:11

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,编辑距离)

链接:hdu 4323 题意:给定n个串和m次询问,对于每次询问,给定一个字符串t,和最大操作次数a, 问在n个字符串中有多少个能在规定的次数之内变成字符串t. 说明:字符串的基本操作仅为:删除.插入和修改一个字符这三种操作 我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作. 两个字符串的编辑距离:两个字符串a和b,通过上述的基本操作,把a变成b或b变成a, 需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离 分析:分别求出n个字符串与字符串t之间的编辑距离,并判断是

hdu 5787 K-wolf Number 数位dp

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

hdu 5898 odd-even number 数位DP

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 716    Accepted Submission(s): 385 Problem Description For a number,if the length of continuous odd digits is even and the length

hdu 3565 Bi-peak Number 数位dp

题意:各位数字先增后减的数称为峰值数(位数大于等3且第一位非零),然后两个峰值数连在一起是一个Bi-peak数, 求两个数之间Bi-peak数的各位数字之和的最大值. 思路:设dp[pos][i][j]表示当前考虑pos位,之前的数位为i,状态为j,与之后(pos+1)位组合构成Bi-peak number,这(pos+1)位数位和的 最大值.状态总共有7种,st=0,初始状态:st=1,恰好有一个在第一个波峰的上坡上:st=2,前面至少有两个在第一个波峰的上 坡上; st=3,在第一个波峰的下

HDU 3709 Balanced Number (数位DP)

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

hdu 5898 odd-even number(数位dp)

Problem Description For a number,if the length of continuous odd digits is even and the length of continuous even digits is odd,we call it odd-even number.Now we want to know the amount of odd-even number between L,R(1<=L<=R<= 9*10^18). Input Fir

hdu 5623 KK&#39;s Number(dp)

问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10?4??)个数,每次KK都会先拿数.每次可以拿任意多个数,直到NN个数被拿完.每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终KK的得分减去对手的得分会是多少? 输入描述 第一行一个数T\left( 1\leq T\leq 10\right)T(1≤T≤10),表示数据组

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