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 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
题意: 给一串无规律字符串,然后给出一个字典,现在要求把上述字符串变成字典中的单词,可以删除任意位置的字符串,求最小删除个数。
dp:可以逆推 ,设dp[i]表示为以第i个字符为起点,然后把从i-L区间内的字符串变成合法所需要的最小删除个数。所以倒着推dp[i]有两种情况 1.删除第i个字符; 2 不删除。
dp[i]= min(dp[i+1]+1 ,dp[k]+d (从i开始往后和字典里的每个单词匹配,d表示匹配成功后所需删除的个数 k表示匹配成功后下一已匹配状态))
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define ll long long
#define maxn 116
#define pp pair<int,int>
#define INF 0x3f3f3f3f
#define max(x,y) ( ((x) > (y)) ? (x) : (y) )
#define min(x,y) ( ((x) > (y)) ? (y) : (x) )
using namespace std;
int n,m,dp[310];
char s[310],dic[610][310];
void solve()
{
	dp[m]=0;
	for(int i=m-1;i>=0;i--)
	{
		dp[i]=dp[i+1]+1;
		for(int j=0;j<n;j++)
		{
			if(strlen(dic[j])<=m-i)
			{
				int k=0,t=i;
				while(t<m&&k<strlen(dic[j]))
				{
					if(s[t]==dic[j][k])
					{
						++t;
						++k;
					}
					else
					++t;
				}
				if(k==strlen(dic[j]))
					dp[i]=min(dp[i],dp[t]+t-i-strlen(dic[j]));
			}
		}
	}
	printf("%d\n",dp[0]);
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		scanf("%s",s);
		for(int i=0;i<n;i++)
			scanf("%s",dic[i]);
		solve();
	}
	return 0;
}
时间: 2025-01-01 21:09:42

POJ 3267-The Cow Lexicon(DP)的相关文章

poj 3267 The Cow Lexicon (dp)

链接:poj 3267 题意:给定一个主串,和单词序列,问最少在主串删除多少字母, 可以使其匹配到单词序列,如 browndcodw cow milk white black brown farmer 删除主串中的两个d,brown和cow就与整个主串匹配了 分析:dp[i]表示从主串中第i个字符开始,到第L个字符(结尾处) 这段区间最少要删除的字符数, 则状态转移方程为: dp[i]=dp[i+1]+1  不能匹配时 dp[i]=min(dp[i],dp[pos]+pos-i-m)  可以匹配

POJ #3267 The Cow Lexicon 型如&quot; E[j] = opt{D+w(i,j)} &quot;的简单DP 区间DP

Description 问题的描述以及输入输出的样例可以看这里:链接 思路 虽然 DISCUSS 中总有人说水题,但是我觉得这道题的质量可以 (或许我比较弱ORZ ,在做过的 DP 题里算 medium 难度. 题目的意思是给你一个主串和一堆子串,需要你将子串和主串完全匹配上,在匹配过程中可以删除主串中匹配不上的字符,最后统计出被删除的最少字符数目. 比如主串是 carmsr ,子串有 car .mr 两种.可以只用 car 去匹配,那么匹配不上的字符有 m.s.r 三个,所以需要删除三个字符:

poj 3267 The Cow Lexicon 动态规划

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

POJ 3267 The Cow Lexicon

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10021   Accepted: 4814 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 sy

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 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

The Cow Lexicon DP

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10659   Accepted: 5116 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 sy

【POJ 3267】 The Cow Lexicon

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