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

USACO 2007 February Silver

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int w,l;
char ch[610];
string vec[610];
int f[610];
int main()
{
    cin>>w>>l;
    for(int i=0;i<l;i++)
      cin>>ch[i];//  字符串
    for(int i=0;i<w;i++)
      cin>>vec[i];//  多个单词
    f[l]=0;
    for(int i=l-1;i>=0;i--)   //对于字符串 我采取 从后向前更新的 方法
    {
        f[i]=f[i+1]+1;//  最坏情况 当前字符需要删除 固由 f[i+1]+1得来
        for(int j=0;j<w;j++)//  遍历每个单词
        {
            int len=vec[j].length();//  获取单词的长度
            if(len<=l-i+1&&vec[j][0]==ch[i])  // 当前遍历到的  字符串 中的 字符到字符串尾 的长度 大于等于 当前查询的单词的长度
            {//  切当前遍历到的字符串中的字符 等于 该单词的首字母
                int pm=i;// 字符串的指针
                int pz=0;//  单词的指针
                while(pm<l)// 检索从此 向后 是否逐字匹配
                {
                    if(vec[j][pz]==ch[pm++])
                      pz++; // 继续向后检索
                    if(pz==len)
                    {
                        f[i]=min(f[i],f[pm]+(pm-i)-len);break;// 检所完成 从i 向后到l与该单词逐字匹配  所以 更新维护f[]
                    }
                }
            }
        }
    }
    cout<<f[0];

    return 0;
}

慢慢推 DP f[pm]+(pm-i)-len 这个地方是我从网上找的 至今没搞明白

时间: 2024-08-06 20:08:21

POJ 3267 The Cow Lexicon的相关文章

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 动态规划

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

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

【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

POJ 3267-The Cow Lexicon(dp_字符串)

The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8341   Accepted: 3941 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 2018 Best Cow Fences

斜率优化DP...<浅谈数形结合思想在信息学竞赛中的应用 安徽省芜湖一中 周源>例题... Best Cow Fences Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9311   Accepted: 2986 Description Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field c

POJ 3189 Steady Cow Assignment(最大流)

POJ 3189 Steady Cow Assignment 题目链接 题意:一些牛,每个牛心目中都有一个牛棚排名,然后给定每个牛棚容量,要求分配这些牛给牛棚,使得所有牛对牛棚的排名差距尽量小 思路:这种题的标准解法都是二分一个差值,枚举下界确定上界,然后建图判断,这题就利用最大流进行判断,值得一提的是dinic的效率加了减枝还是是卡着时间过的,这题理论上用sap或者二分图多重匹配会更好 代码: #include <cstdio> #include <cstring> #inclu