The Cow Lexicon(POJ-3267)
Problem Description
Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their cowmunication system, based on mooing, is not very accurate; sometimes they hear words that do not make any sense. For instance, Bessie once received a message that said "browndcodw". As it turns out, the intended message was "browncow" and the two letter "d"s were noise from other parts of the barnyard.
The cows want you to help them decipher a received message (also containing only characters in the range 'a'..'z') of length L (2 ≤ L ≤ 300) characters that is a bit garbled. In particular, they know that the message has some extra letters, and they want you to determine the smallest number of letters that must be removed to make the message a sequence of words from the dictionary.
Input
Line 1: Two space-separated integers, respectively: W and L?
Line 2: L characters (followed by a newline, of course): the received message?
Lines 3..W+2: The cows' dictionary, one word per line
Output
Line 1: a single integer that is the smallest number of characters that need to be removed to make the message a sequence of dictionary words.
?
Sample Input
6 10
browndcodw
cow
milk
white
black
brown
farmer
Sample Output
2
題意:給出一個長度為l的字符串,與w個詞,問最少刪掉字符串中的幾個字母后可使字符串全部由所給的單詞組成。
思路:
用 f[i]=n 來表示字符串刪掉n個字母后剩下的串可由單詞構成,易得:
若不存在單詞可以與字符串str中str[i]開頭的字符串匹配,則有:f[i]=f[i+1]+1
若存在單詞可以匹配,且str[t-1]為可以匹配的字符串的最后一個字符,匹配的單詞的長度為n,則有:f[i]=min(f[i+1]+1,f[t]+t-i-n)
Source Program
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 1001 #define MOD 123 #define E 1e-6 using namespace std; string str; string word[N]; int f[N]; int main() {int w,l;scanf("%d%d",&w,&l);cin>>str;for(int i=0;i<w;i++)cin>>word[i];f[l]=0;for(int i=l-1;i>=0;i--){f[i]=f[i+1]+1;for(int j=0;j<w;j++){if(word[j].length()<=l-i && word[j].at(0)==str[i])//當第j個單詞的首字母與字符串中匹配時{int t=i;int n=0;while(t<l){if(word[j].at(n)==str[t++])//匹配單詞第n個字母是否與字符串匹配n++;if(n==word[j].length()){f[i]=min(f[t]+t-i-n,f[i]);break;}}}}}printf("%d\n",f[0]); }?
總結
以上是生活随笔為你收集整理的The Cow Lexicon(POJ-3267)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 昆虫繁殖(信息学奥赛一本通-T1312)
- 下一篇: 混合背包(信息学奥数一本通-T1270)