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很難,各種優化,甚至現在基礎的都不會,要加油。
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就能过,难过的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞机耳机插哪里
- 下一篇: USACO 2.1 海明码 Hammin