去年的多校 编辑距离的变形 暴力居然过了 还想了好久别的方法,想得很头疼
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 int dp[12][12],kk[1510],num[1010]; 8 char s[1510][12],ss[12]; 9 int main() 10 { 11 int i,j,k,n,m,t,a,b,o=0,g; 12 scanf("%d",&t); 13 while(t--) 14 { 15 o++; 16 scanf("%d%d",&n,&m); 17 for(i = 1; i <= n ;i++) 18 { 19 scanf("%s",s[i]); 20 kk[i] = strlen(s[i]); 21 } 22 for(i = 1 ; i <= m ; i++) 23 { 24 scanf("%s %d",ss,&g); 25 num[i]=0; 26 k = strlen(ss); 27 for(j = 1; j <= n ; j++) 28 { 29 if(abs(k-kk[j])>g) 30 continue; 31 int f=1; 32 memset(dp,0,sizeof(dp)); 33 for(a = 1 ; a <= k ; a++) 34 dp[a][0] = a; 35 for(b = 1 ; b <= kk[j] ; b++) 36 dp[0][b] = b; 37 for(a = 1 ; a <= k ; a++) 38 for(b = 1 ; b <= kk[j] ; b++) 39 { 40 if(ss[a-1]==s[j][b-1]) 41 dp[a][b] = dp[a-1][b-1]; 42 else 43 dp[a][b] = dp[a-1][b-1]+1; 44 dp[a][b] = min(dp[a][b],min(dp[a][b-1]+1,dp[a-1][b]+1)); 45 } 46 if(dp[k][kk[j]]<=g) 47 num[i]++; 48 } 49 } 50 printf("Case #%d:\n",o); 51 for(i = 1; i <= m ; i++) 52 printf("%d\n",num[i]); 53 } 54 return 0; 55 }