POJ3267The Cow Lexicon

http://poj.org/problem?id=3267

题意 : 给你一个message,是给定字符串,然后再给你字典,让你将message与字典中的单词进行匹配,输出要删掉多少字母。

思路 : 动态规划问题,不仅要找对公式,还要注意一些细节问题

样例解释 : 6是字典里有6个单词,10是给定的字符串的长度,给定的字符串可以与下面的brown和cow匹配,但要删掉两个字母

6 10

browndcodw

cow

milk

white

black

brown

farmer
#include<cstdio>

#include<cstring>

#include<string>

#include<iostream>

using namespace std ;

int main()

{

    int W,L,len ;

    string mess,dic[40000];

    cin>>W>>L ;

    int dp[10000] ;

    cin>>mess ;

    for(int i = 0 ; i < W ; i++)

        cin>>dic[i] ;

    dp[L] = 0 ;//dp[i]代表着从i到L所要删除的字符个数

    for(int i = L-1 ; i >= 0 ; i--)//从message中倒着找

    {

        dp[i] = dp[i+1]+1 ;//先将最坏的可能存入数组

        for(int j = 0 ; j < W ; j++)

        {

            len = dic[j].length() ;

            if(len <= L-i && dic[j][0] == mess[i])//字典里的某个单词的长度要小于你进行匹配的一部分message的长度

            {

                int me = i,di = 0 ;

                while(me < L)

                {

                    if(dic[j][di] == mess[me++])

                    {

                        di++ ;

                    }

                    if(di == len)

                    {

                        dp[i] = min(dp[i],dp[me]+me-i-len) ;//dp[me]代表着从me到L要删除的字符的个数,me-i代表匹配过程中,从位置i到me的区间长度,再减去单词长度,即可得则得到从i到me所删除的字符数

                        break ;

                    }

                }

            }

        }

    }

    cout<<dp[0]<<endl ;

    return 0 ;

}
View Code

 

你可能感兴趣的:(icon)