POJ3267——The Cow Lexicon(动态规划)

The Cow Lexicon

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

题目大意:

    题意就是给出一个主串,和一本字典,问最少在主串删除多少字母,可以使其匹配到字典的单词序列.
    PS:是匹配单词序列,而不是一个单词

解题思路:

    动态规划。网上多数是从后往前推。我从前往后推也AC了。发现更好理解一些。

    具体细节看代码。

Code:

 1 /*************************************************************************
 2     > File Name: poj3267.cpp
 3     > Author: Enumz
 4     > Mail: [email protected]
 5     > Created Time: 2014年10月17日 星期五 18时28分18秒
 6  ************************************************************************/
 7 #include<iostream>
 8 #include<cstdio>
 9 #include<cstdlib>
10 #include<string>
11 #include<cstring>
12 #include<list>
13 #include<queue>
14 #include<stack>
15 #include<map>
16 #include<set>
17 #include<algorithm>
18 #define MAXN 1001
19 using namespace std;
20 char dic[MAXN][MAXN];
21 char mes[MAXN];
22 int dp[MAXN];
23 int N,M;
24 int Incl(int i,int j) //判断字典j是否包含在字符串前i位内
25 {
26     int Ndic=strlen(dic[j])-1;
27     if (dic[j][Ndic]!=mes[i]) return -1;
28     while (1)
29     {
30         if (Ndic==-1||i==-1) break;
31         if (dic[j][Ndic]==mes[i]) i--,Ndic--;
32         else i--;
33     }
34     if (Ndic==-1) return i+1; //返回字典i匹配的第一个字符的位置。
35     else return -1;
36 }
37 int solve()
38 {
39     for (int i=0; i<=M-1; i++)
40     {
41         if (i!=0)
42             dp[i]=dp[i-1]+1;
43         else
44             dp[i]=1;
45         for (int j=1; j<=N; j++)
46         {
47             int k=Incl(i,j); //判断字典j是否包含在字符串前i位内
48             if (k!=-1)
49             {
50                 //回溯到字符串开头处时,需要特判。注意if语句!WA了好几遍
51                 if (k-1<0&&dp[i]>i+1-k-strlen(dic[j]))
52                     dp[i]=(i+1-k-strlen(dic[j]));
53                 else if (dp[i]>dp[k-1]+i+1-k-strlen(dic[j]))
54                     dp[i]=dp[k-1]+i+1-k-strlen(dic[j]);
55             }
56         }
57     }
58     return dp[M-1];
59 }
60 int main()
61 {
62     while (scanf("%d%d",&N,&M)!=EOF)
63     {
64         memset(dp,0,sizeof(dp));
65         memset(dic,0,sizeof(dic));
66         memset(mes,0,sizeof(mes));
67         scanf("%s",mes);
68         for (int i=1; i<=N; i++)
69             scanf("%s",dic[i]);
70         printf("%d\n",solve());
71     }
72     return 0;
73 }

    

时间: 2024-08-22 03:09:24

POJ3267——The Cow Lexicon(动态规划)的相关文章

POJ3267 The Cow Lexicon(DP+删词)

The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9041   Accepted: 4293 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 c

poj 3267 The Cow Lexicon 动态规划

题目链接:http://poj.org/problem?id=3267 给一个字典 求原串中至少去掉多少个字母可以让已给字典可以完整覆盖原串 在跟字典作匹配时 注意原串是“可跳跃的” 即存在“删掉某个字母后 该字母的前后两部分拼起来组成单词” 针对这种情况 考虑使用两个指针 匹配时:同时往后滑1格 不匹配时:仅指向原串的指针往后滑1格 之所以网上大部分题解都是从原串的最后往前推 是因为这样写起来下标容易控制 最外层循环的原串从后往前 则匹配过程可以较自然地从前往后 而匹配过程明显更为复杂 所以这

poj3267(The Cow Lexicon)

题目地址:The Cow Lexicon 题目大意: 奶牛有自己的识别单词的语言,它有自己的字典序列,如果给一串字符不符合奶牛的字典里的单词,奶牛就无法识别,你的任务就是找出给的字符串中包含给出奶牛字典的单词,至少从主串里删除几个字符,使主串只包含奶牛字典里的单词,不包含多于的字符. 解题思路: 动态规划dp. DP一直都不太懂,不看解题报告根本推不出来状态方程,入门水平都不够,需要好好练习学习该知识点. 状态方程: dp[i] i 代表从i到L最少需要删除的字符个数. 首先分为两种思想: 一是

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

题目 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 401  Solved: 216[Submit][Status] Description 没有几个人知道,奶牛有她们自己的字典,里面的有W (1 ≤ W ≤ 600)个词,每个词的长度不超过25,且由小写字母组成.她们在交流时,由于各种原因,用词总是不那么准确.比如,贝茜听到有人对她说"browndcodw"

POJ 3276 The Cow Lexicon DP-字符串匹配

点击打开链接 The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8325   Accepted: 3934 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'.

poj3267--The Cow Lexicon(dp:字符串组合)

The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8211   Accepted: 3864 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 c

洛谷P2875 [USACO07FEB]牛的词汇The Cow Lexicon

P2875 [USACO07FEB]牛的词汇The Cow Lexicon 题目描述 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; sometime

【POJ 3267】 The Cow Lexicon

[POJ 3267] The Cow Lexicon 训练计划里把这题排到了topo里....然后我就这么死盯研究了一周topo算法(期间经历了三个人生风波....大物考试 高数考试跟模电考试----)啥不说了--上dp代码----没错 这是个dp!...赤果果的dp..就呢么傻呆呆地研究Topo算法--结果没研究出来.. 题意是给一个字符串和m个单词组成的字典,问最少删除几个字母能让这个字符串变成由字典中几个单词首位链接组成的字符串 dp思路还算好想 逆推 dp数组的下标是遍历字符串的起点 然

POJ 3267-The Cow Lexicon(DP)

The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8252   Accepted: 3888 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 c