poj3267--The Cow Lexicon(dp:字符串组合)

2024-08-25 01:18

本文主要是介绍poj3267--The Cow Lexicon(dp:字符串组合),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

The Cow Lexicon
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 8211 Accepted: 3864

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[i]表示从头开始到第i个字符最少要消除多少个字符,
首先dp[0] = 1 ;
dp[i] = dp[i-1] , 匹配不到
dp[i] = dp[j] + k 出现字符串可以匹配到从j+1到i的字符串中,k = 从j+1到i完成匹配需要消除的字符。
一开始用最长公共子序列写,后来发现,在对dp[i]寻找从0到i有没有单词可以匹配的时候,要求,单词的最后一个单词一定和s[i]相同,不然那个单词在之前就已经匹配过了。
所以只要用普通的遍历就可以了。
PS:对于不知道开始或结束的位置的字符串判字串,用最长公共子序列,如果知道一个确定的位置,直接匹配。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int l ;
char s[30] ;
} p[700];
int dp[400];
char s[400] ;
int cmp(node a,node b)
{
return a.l < b.l ;
}
int main()
{
int i , j , n , l ;
while( scanf("%d %d", &n, &l)!=EOF)
{
scanf("%s", s);
for(i = 0 ; i < n ; i++)
{
scanf("%s", p[i].s);
p[i].l = strlen(p[i].s);
}
sort(p,p+n,cmp);
memset(dp,0,sizeof(dp));
dp[0] = 1 ;
for(i = 0 ; i < l ; i++)
{
if(i)
dp[i] = dp[i-1]+1 ;
for( j = 0 ; p[j].l <= i+1 ; j++)
{
int k1 = i , k2 = p[j].l-1 ;
if( s[k1] != p[j].s[k2] ) continue ;
while( k1 >= 0 && k2 >= 0 )
{
if( s[k1] == p[j].s[k2] )
{
k1-- ;
k2-- ;
}
else
k1-- ;
}
if( k2 == -1 )
{
dp[i] = min( dp[i],dp[k1]+i-k1-p[j].l );
}
}
}
printf("%d\n", dp[l-1]);
}
return 0;
}

这篇关于poj3267--The Cow Lexicon(dp:字符串组合)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104143

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方