The Cow Lexicon

Time Limit: 2000MS Memory Limit: 65536K

Total Submissions: 11846 Accepted: 5693

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

就是问你删多少个字母让他成为字典里的单词构成的

这是我的垃圾的错误超时的代码,等有空再用优先队列优化一下,卡的就是三重循环,我觉得我就是被制裁了。

好好学习DP,听学长说比赛的时候DP不是我们这个水平的人做的,我也知道DP很难,各种优化,甚至现在基础的都不会,要加油。

include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include <fstream>
#include<set>
using namespace std;
string a,b[1000];
queue<string> dd;
set<string>ww;
string del(string a,string b);
int ans;
int main()
{
int m,n;
std::ios::sync_with_stdio(false);
while(!dd.empty()) dd.pop();
ww.clear();
cin>>m>>ans;
cin>>a;
for(int i=0;i<m;i++)
{
cin>>b[i];
if(a==b[i]){
cout<<0<<endl;
return 0;
}
string tem=del(a,b[i]);
if(a!=tem)
dd.push(tem);
}
while(!dd.empty())
{
string demo=dd.front();
ans=min(ans,(int)demo.size());
if(!ans){
cout<<0<<endl;
return 0;
}
for(int i=0;i<m;i++){
string tem=del(demo,b[i]);
if(demo!=tem){
string tee=del(tem,b[i]);
while(tee!=tem)
{
tem=tee;
tee=del(tem,b[i]);
}
if(tem.size()<=ans)
if(ww.insert(tem).second)dd.push(tem);
}
}
dd.pop();
}
cout<<ans<<endl;
return 0;
}
string del(string a,string b)
{
int j=0;
string tem;
string w=a;
bool flag=0;
for(int i=0;i<a.size();i++)
{
if(flag) tem.push_back(a[i]);
else if(a[i]==b[j]) j++;
else tem.push_back(a[i]);
if(j==b.size())flag=1;
}
if(flag) return tem;
else return w;
}

ACcode

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxl = 305;
string sentence; //要解码的句子
string words[601]; //字典中的句子
int w, l, d[maxl]; //d[i]表示地i个
int main()
{
scanf("%d%d", &w, &l);
cin>> sentence;
for(int i = 0; i < w; i++) cin>>words[i];
d[l] = 0;
for(int i = l-1; i >= 0; i--) {
d[i] = d[i+1] + 1;
for(int j = 0; j < w; j++) {
int len = words[j].size();
if(sentence[i] == words[j][0] && l-i >= len) {
int pSentence = i, pWords = 0;
while(pSentence < l) {
if(words[j][pWords] == sentence[pSentence]) {
pSentence++; pWords++;
}
else pSentence++;
if(pWords == len) {
d[i] = min(d[i], d[pSentence]+(pSentence-i)-len);
}
}
}
}
}
//for(int i = 0; i < 10; i++) printf("%d ", d[i]); printf("\n");
printf("%d\n", d[0]);
return 0;
}

POJ 3267为什么优先队列超时,DP就能过,难过的更多相关文章

  1. poj 3431 Expedition 优先队列

    poj 3431 Expedition 优先队列 题目链接: http://poj.org/problem?id=2431 思路: 优先队列.对于一段能够达到的距离,优先选择其中能够加油最多的站点,这 ...

  2. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  3. poj 3311(状态压缩DP)

    poj  3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...

  4. poj 1185(状态压缩DP)

    poj  1185(状态压缩DP) 题意:在一个N*M的矩阵中,‘H'表示不能放大炮,’P'表示可以放大炮,大炮能攻击到沿横向左右各两格,沿纵向上下各两格,现在要放尽可能多的大炮使得,大炮之间不能相互 ...

  5. poj 3254(状态压缩DP)

    poj  3254(状态压缩DP) 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相 ...

  6. poj 2324 Anniversary party(树形DP)

    /*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ...

  7. POJ 3267:The Cow Lexicon(DP)

    http://poj.org/problem?id=3267 The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submi ...

  8. POJ 3267 The Cow Lexicon 简单DP

    题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...

  9. poj 3267 The Cow Lexicon(dp)

    题目:http://poj.org/problem?id=3267 题意:给定一个字符串,又给n个单词,求最少删除字符串里几个字母,能匹配到n个单词里 #include <iostream> ...

随机推荐

  1. javascript中的constructor

    constructor,构造函数,对这个名字,我们都不陌生,constructor始终指向创建当前对象的构造函数. 这里有一点需要注意的是,每个函数都有一个prototype属性,这个prototyp ...

  2. 页面DIV弹出层 JS原生脚本

    <script type="text/javascript"> /*         * 弹出DIV层         */ function showDiv() { ...

  3. Redis cluster集群配置教程

    这里建议大家安装4.0.9版本的 1.打开Centos虚拟机,登陆. 2.通过WinSCP把Redis集群tar包上传到虚拟机里的目录里,我的目录是 /usr/local 这里我已经上传过了并解压了, ...

  4. python3(三十) Enum

    """ """ __author__ = 'shaozhiqi' # 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: ...

  5. log4j入门(转) --- 很详细 也很简单容易懂

    log4j入门(转) Log4j实在是很熟悉,几乎所有的Java项目都用它啊.但是我确一直没有搞明白.终于有一天我受不了了,定下心去看了一把文档,才两个小时,我终于搞明白了.一般情况下Log4j总是和 ...

  6. day22作业

    # 1.检索文件夹大小的程序,要求执行方式如下 # python3.8 run.py 文件夹 import os,sys l = sys.argv[1] size = 0 def get_size(f ...

  7. Git敏捷开发--rebase命令

    git rebase是git下比较常用的命令,以下记录自己遇到较多的使用场景. 合并分支 在多人协作的项目中,拉分支是很常见的事情,经常需要同步自己的分支与远端master分支一致,有两种方式: gi ...

  8. js的中文英文排序

    本例主要实现 中文汉字按拼音排序的方法和英文按照首字母排序的方法. //要排序的数据 let data = [ {chinese: '蔡司', english: 'Chase'}, {chinese: ...

  9. java 脚本引擎执行js

    为用到时,使用方便直接保存一下代码 package com.xzlf.reflectTest; import java.io.BufferedReader; import java.io.FileIn ...

  10. JasperReports入门教程(一):快速入门

    JasperReports入门教程(一):快速入门 背景 现在公司的项目需要实现一个可以配置的报表,以便快速的适应客户的需求变化.后来在网上查资料发现可以使用JasperReports + Jaspe ...