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. 2020-3-30 20175110王礼博 Exp3 免杀原理与实践

    目录 1.正确使用msf编码器 2.msfvenom生成如jar之类的其他文件 3.veil 4.加壳工具 5.使用C + shellcode编程 6.使用其他课堂未介绍方法 7.通过组合应用各种技术 ...

  2. canal使用记录

    canal是阿里巴巴的来源项目.我们可以通过配置binlog实现数据库监控,得到数据库表或者数据的更新信息.参考我的文档前先去官网看下,可能已经支持更高版本的MySQL了 1. 查看官方开源项目 ht ...

  3. 如何教零基础的人认识Python

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 编程派 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  4. work of 1/4/2016

    part 组员                今日工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云 修改UI增强显示鲁棒     6 完成UI页面切换部分    ...

  5. A Bug's Life POJ 2492

    D - A Bug's Life 二分图 并查集 BackgroundProfessor Hopper is researching the sexual behavior of a rare spe ...

  6. 掷骰子 dp

    B. 掷骰子 单点时限: 2.0 sec 内存限制: 512 MB 骰子,中国传统民间娱乐用来投掷的博具,早在战国时期就已经被发明. 现在给你 n 个骰子,求 n 个骰子掷出点数之和为 a 的概率是多 ...

  7. 批量重命名脚本(Python)

    便携的批处理脚本,代码如下: import os import sys def rename(): path=input("请输入路径(例如D:/picture):") name= ...

  8. linq 高集成化数据访问技术

    一:  新建名为linq的项目 创建 linq 1 在项目里添加文件夹 App_Code; 2 在文件夹(App_Code) 添加  名为db的    Linq To Sql 类  :一个Linq T ...

  9. 解析网站爬取腾讯vip视频

    今天用油猴脚本vip一件解析看神奇队长.想到了问题,这个页面应该是找到了视频的api的接口,通过接口调用获取到了视频的地址. 那自己找腾讯视频地址多费劲啊,现在越来越多的参数,眼花缭乱的. 那我就找到 ...

  10. [Abp vNext 入坑分享] - 3.简单的用户模块功能开发

    一.简要说明 本篇文章开始进行业务模块的开发模拟,借助user模块来进行业务开发,主要是用户相关的基础操作.主要是先使用Users来体验整个开发的流程.主要是先把一个基础流程跑顺利,在这里我并不会过于 ...