1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典

Description

没有几个人知道,奶牛有她们自己的字典,里面的有W (1 ≤ W ≤ 600)个词,每个词的长度不超过25,且由小写字母组成.她们在交流时,由于各种原因,用词总是不那么准确.比如,贝茜听到有人对她说"browndcodw",确切的意思是"browncow",多出了两个"d",这两个"d"大概是身边的噪音. 奶牛们发觉辨认那些奇怪的信息很费劲,所以她们就想让你帮忙辨认一条收到的消息,即一个只包含小写字母且长度为L (2 ≤ L ≤ 300)的字符串.有些时候,这个字符串里会有多余的字母,你的任务就是找出最少去掉几个字母就可以使这个字符串变成准确的"牛语"(即奶牛字典中某些词的一个排列).

Input

第1行:两个用空格隔开的整数,W和L.

第2行:一个长度为L的字符串,表示收到的信息. 第3行至第W+2行:奶牛的字典,每行一个词.

Output

唯一一行:一个整数,表示最少去掉几个字母就可以使之变成准确的"牛语".

 

Sample Input

6 10
browndcodw
cow
milk
white
black
brown
farmer

Sample Output

2
 
先模拟找出每个牛语是否在字符串中出现,然后再DP。。。。
代码来自hzwer。。。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<set>
 8 #include<map>
 9 #include<vector>
10 #define maxn 100010
11 #define maxm 500010
12 #define inf 10000000
13 #define ll long long
14 using namespace std;
15 int n,f[305],L;
16 char a[305],b[605][30];
17 int cal(int x,int len,int y)
18 {
19     int tot=0;
20     int l1=x,l2=1;
21     while(l1<=L)
22     {
23         if(a[l1]==b[y][l2])l2++;
24         else tot++;
25         if(l2==len+1)return tot;
26         l1++;
27     }
28     return -1;
29 }
30 int main()
31 {
32     scanf("%d%d",&n,&L);
33     scanf("%s",a+1);
34     for(int i=1;i<=n;i++)
35         scanf("%s",b[i]+1);
36     f[L+1]=0;
37     for(int i=L;i;i--)
38     {
39         f[i]=f[i+1]+1;
40         for(int j=1;j<=n;j++)
41         {
42             int len=strlen(b[j]+1);
43             int t=cal(i,len,j);
44             if(t!=-1)f[i]=min(f[i],f[i+len+t]+t);
45         }
46     }
47     printf("%d",f[1]);
48     return 0;
49 }
View Code
posted @ 2015-10-22 14:50  HTWX  阅读(159)  评论(0编辑  收藏  举报