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

 

posted on 2013-10-12 17:55  枫、  阅读(136)  评论(0编辑  收藏  举报