POJ 3267为什么优先队列超时,DP就能过,难过
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就能过,难过的更多相关文章
- poj 3431 Expedition 优先队列
poj 3431 Expedition 优先队列 题目链接: http://poj.org/problem?id=2431 思路: 优先队列.对于一段能够达到的距离,优先选择其中能够加油最多的站点,这 ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- poj 3311(状态压缩DP)
poj 3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...
- poj 1185(状态压缩DP)
poj 1185(状态压缩DP) 题意:在一个N*M的矩阵中,‘H'表示不能放大炮,’P'表示可以放大炮,大炮能攻击到沿横向左右各两格,沿纵向上下各两格,现在要放尽可能多的大炮使得,大炮之间不能相互 ...
- poj 3254(状态压缩DP)
poj 3254(状态压缩DP) 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相 ...
- poj 2324 Anniversary party(树形DP)
/*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ...
- POJ 3267:The Cow Lexicon(DP)
http://poj.org/problem?id=3267 The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submi ...
- POJ 3267 The Cow Lexicon 简单DP
题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...
- poj 3267 The Cow Lexicon(dp)
题目:http://poj.org/problem?id=3267 题意:给定一个字符串,又给n个单词,求最少删除字符串里几个字母,能匹配到n个单词里 #include <iostream> ...
随机推荐
- Linux基础篇,系统服务(service)的管理
一.服务是什么? 用白话文说,服务就是"常驻在内存中的进程",用来提供一些系统或网络功能. 二.service和daemon的区别与联系 因为服务(service)本质上来说也是程 ...
- git处理fork的个人库代码与远程项目库待代码同步与合并
由于每个项目组git代码管理规范都不一致,分支开发和fork开发模式.我就说下fork处理的流程吧. 问题点: 我的代码是从自己的远程个人仓库clone的.我的个人远程仓库代码是从项目的远程仓库弄fo ...
- Idea离线安装plugins插件 如Lombok
由于公司不允许使用外网,之前用的idea 15 安装了一次.但是idea15的提示不够友好,今天升级idea2017.3.2,同样又需要安装,那就写个教程吧. 网上其他的安装教程不通用,也是针对不同i ...
- 03 GUI界面的错误日志查看及清除
右上角图标,会显示当前使用工具的运行报错信息,点击可在下方查看到实际的错误日志
- 一个lock锁就可以分出低中高水平的程序员对问题的处置方式
说到lock锁,我相信在座的各位没有不会用的,而且还知道怎么用不会出错,但让他们聊一聊为什么可以锁住,都说人以群分,大概就有了下面低中高水平的三类人吧. 第一类人 将lock对象定义成static,这 ...
- java解惑之常常忘记的事
java解惑之常常忘记的事 2012-10-17 18:38:57| 分类: JAVA | 标签:基础知识 软件开发 |举报|字号 订阅 针对刚接触java的菜鸟来说,java基础知识 ...
- 数据结构和算法(Golang实现)(17)常见数据结构-树
树 树是一种比较高级的基础数据结构,由n个有限节点组成的具有层次关系的集合. 树的定义: 有节点间的层次关系,分为父节点和子节点. 有唯一一个根节点,该根节点没有父节点. 除了根节点,每个节点有且只有 ...
- JSR303完成validate校验并编写BeanValidator工具类
一.引入pom依赖 <!-- validator --> <dependency> <groupId>javax.validation</groupId> ...
- 常见的 PHP 面试题和答案分享
如何直接将输出显示给浏览器? 将输出直接显示给浏览器,我们必须使用特殊标记 <?=and?>. PHP 是否支持多重继承? PHP 只支持单继承.PHP 的类使用关键字 extends 继 ...
- 如何改变Xcode字体大小?
运行Xcode后依次点击左上角Xcode/Preferences/Fonts & Colors里就可以调整,在右边随便点中一个字体就可以调整这个字体的大小和颜色了,按command+a可以将所 ...