POJ 3267 The Cow Lexicon


The Cow Lexicon
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 9759   Accepted: 4678

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

Source

[Submit]   [Go Back]   [Status]   [Discuss]

Home Page   Go Back  To top



  這個題半天沒讀懂,看了半天評論後大概是這麼個意思:第一行輸入一個長度爲L的字母串,剩下的W行爲W個字典單詞,然後讓字符串與每一個字典單詞進行匹配,問字符串最少需要刪除的字母的個數。這道題就是DP+字符串匹配了,動態轉移方程如下:


動態轉移方程:    DP[i]=DP[i+1]+1;(沒有滿足匹配的單詞)

           DP[i]=min(DP[i],DP[pm]+(pm-i)+len);(有滿足匹配的單詞)


   DP[i]表示的是message[i]到message[len-1]的滿足的最小出去字母的個數,如果字典單詞中沒有能夠匹配的,DP[i]直接等於DP[i+1]+1 ;如果存在能夠匹配的單詞,DP[i]=min(DP[i],DP[pm]+(pm-i)+len),這個就拿第一個爲例:


  message: browndcodw      ----->       browndcodw      


              dir[0]: cow                                              co   w


此時pm(message的指針)數值爲10,pd(dir的指針)數值爲3,這期間沒有匹配的字母(這裏就爲d)的個數爲(pm-i)+len(i爲message初始指針初始位置),加上第pm之後需要刪除的最小值(這裏是dp[10],數值爲零)總的就爲 DP[i]=min(DP[i],DP[pm]+(pm-i)+len);


//880K 329MS
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[300+5];
int main()
{
    char message[300+5], dir[600+5][300+5];
    int w, l;
    cin>>w>>l;
    cin>>message;
    for(int i=0;i<w;i++)
        cin>>dir[i];
    dp[l]=0;
    for(int i=l-1;i>=0;i--) {
        dp[i]=dp[i+1]+1;
        for(int j=0;j<w;j++) {
            int pm=i, pd=0;
            int len=strlen(dir[j]);
            if(len<=l-i) {
                while(pm<l) {
                    if(message[pm++]==dir[j][pd])
                        pd++;
                    if(pd==len) {cout<<i<<' '<<j<<' '<<pm<<' '<<i<<' '<<len<<endl;dp[i]=min(dp[i],dp[pm]+(pm-i)-len);break;}
                }
            }
        }
    }
    cout<<dp[0]<<endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章