博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3267 The Cow Lexicon(动态规划)
阅读量:4326 次
发布时间:2019-06-06

本文共 2719 字,大约阅读时间需要 9 分钟。

The Cow Lexicon

Time Limit: 2000MS

 

Memory Limit: 65536K

Total Submissions: 5719

 

Accepted: 2638

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

 解题报告:题意就是给出一个序列,和其他的单词进行匹配,求最少去掉的单词数,思路参考的网上的,代码中有解释;

代码如下:

#include 
#include
#include
using namespace std; const int N = 610; int len[N], dp[N];//dp[i]表示第i个字符串最少删除的字符数 char str[N], word[N][N]; int L, W; int Min(int a,int b) {
return a < b ? a : b; } void DP() {
int i, j, k, p; memset(dp, 0, sizeof(dp));//初始化 for(i = 1; i <= L; ++i)//循环单词的长度, {
dp[i] = dp[i - 1] + 1; for (j = 1; j <= W; ++j) {
k = len[j] - 1;//所要匹配的单词的最后字母的位置 p = i - 1; while (k >= 0 && p >= 0)//从后向前匹配 {
if (word[j][k] == str[p]) {
k --; } p --; } if (k < 0)//若k<0说明匹配成功时 {
dp[i] = Min(dp[i], dp[p + 1] + i - p - 1 - len[j]); //状态方程(i - p - 1 -len[j])第j个单词匹配成功时多余的单词数,列如browndcodw //和cow匹配时,从后向前匹配此时i = 10;匹配成功时正好匹配到codw,四个单词,而cow是三个, //所以(i - p - 1 -len[j])= 1; } } } } int main() {
int i; scanf("%d%d", &W, &L); scanf("%s", str); memset(word, 0, sizeof(word)); for (i = 1; i <= W; ++i) {
scanf("%s", word[i]); len[i] = strlen(word[i]); } DP(); printf("%d\n", dp[L]); return 0; }

转载于:https://www.cnblogs.com/lidaojian/archive/2012/03/07/2384133.html

你可能感兴趣的文章
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>
Http协议的学习
查看>>
【转】轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
设计模式那点事读书笔记(3)----建造者模式
查看>>
ActiveMQ学习笔记(1)----初识ActiveMQ
查看>>
Java与算法之(2) - 快速排序
查看>>
Windows之IOCP
查看>>
机器学习降维之主成分分析
查看>>
CTP2交易所成交回报
查看>>
WebSocket & websockets
查看>>
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
使用正确的姿势跨域
查看>>
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>
总结(6)--- python基础知识点小结(细全)
查看>>