题目描述

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.

输入格式

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

输出格式

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.

样例 #1

样例输入 #1

6 10
browndcodw
cow
milk
white
black
brown
farmer

样例输出 #1

2

首先考虑暴力。设计\(dp_i\)表示前i个字符要去掉多少个字符可以被翻译。暴力转移就是枚举上一个单词的结尾在j,在j+1~i中只能有一个单词,那么价值是\((i-j)-\)最长的单词。不妨枚举选了哪一种单词,然后看一下能不能匹配。

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int w,l,dp[N],len[N];
char s[N][N],t[N];
int can(int x,int y)
{
int ans=y-x+1;
for(int k=1;k<=w;k++)//枚举选哪一种单词
{
int r=1;
for(int i=x;i<=y;i++)
{
if(s[k][r]==t[i])
++r;
if(r>len[k])//可以匹配上
ans=min(ans,y-x+1-len[k]);
}
}
return ans;
}
int main()
{
scanf("%d%d%s",&w,&l,t+1);
for(int i=0;i<=l;i++)
dp[i]=i;
for(int i=1;i<=w;i++)
scanf("%s",s[i]+1),len[i]=strlen(s[i]+1);
for(int i=1;i<=l;i++)
for(int j=0;j<i;j++)
dp[i]=min(dp[i],dp[j]+can(j+1,i));
printf("%d",dp[l]);
return 0;
}

但是会超时获得70分。我们发现可以预处理出每个can(l,r)。枚举l和选哪种单词,然后往后推r,如果一个单词在某一处可以被匹配那么在后面都可以匹配的上。

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int w,l,dp[N],len[N],f[N][N];
char s[N][N],t[N];
int can(int x,int y)
{
int ans=2e9;
for(int k=1;k<=w;k++)
{
int r=1;
for(int i=x;i<=y;i++)
{
if(s[k][r]==t[i])
++r;
if(r>len[k])
ans=min(ans,y-x+1-len[k]);
}
}
return ans;
}
int main()
{
memset(f,0x7f,sizeof(f));
scanf("%d%d%s",&w,&l,t+1);
for(int i=0;i<=l;i++)
dp[i]=i;
for(int i=1;i<=w;i++)
scanf("%s",s[i]+1),len[i]=strlen(s[i]+1);
// return can(6,10);
for(int i=1;i<=l;i++)
{
int ans=2e9;
for(int k=1;k<=w;k++)
{
int r=1;
for(int j=i;j<=l;j++)
{
if(s[k][r]==t[j])
++r;
if(r>len[k])
f[i][j]=min(f[i][j],j-i+1-len[k]);
}
}
}
for(int i=1;i<=l;i++)
for(int j=0;j<i;j++)
dp[i]=min(dp[i],dp[j]+f[j+1][i]);
printf("%d",dp[l]);
return 0;
}

[USACO2007FEB S] The Cow Lexicon S的更多相关文章

  1. POJ3267 The Cow Lexicon(DP+删词)

    The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9041   Accepted: 4293 D ...

  2. POJ 3267 The Cow Lexicon

    又见面了,还是原来的配方,还是熟悉的DP....直接秒了... The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submis ...

  3. POJ 3267:The Cow Lexicon(DP)

    http://poj.org/problem?id=3267 The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submi ...

  4. The Cow Lexicon

    The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8815 Accepted: 4162 Descr ...

  5. HDOJ-三部曲-1015-The Cow Lexicon

    The Cow Lexicon Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) To ...

  6. POJ3267——The Cow Lexicon(动态规划)

    The Cow Lexicon DescriptionFew know that the cows have their own dictionary with W (1 ≤ W ≤ 600) wor ...

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

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

  8. BZOJ 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典

    题目 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 401  Solv ...

  9. POJ 3267-The Cow Lexicon(DP)

    The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8252   Accepted: 3888 D ...

  10. bzoj1633 / P2875 [USACO07FEB]牛的词汇The Cow Lexicon

    P2875 [USACO07FEB]牛的词汇The Cow Lexicon 三维dp 它慢,但它好写. 直接根据题意设三个状态: $f[i][j][k]$表示主串扫到第$i$个字母,匹配到第$j$个单 ...

随机推荐

  1. 领域驱动设计(DDD):从基础代码探讨高内聚低耦合的演进

    大家好,我是付威,一名已在编码第一线奋斗了十余年的程序员.在2019年我初次接触到领域驱动设计(Domain-Driven Design,简称DDD)的概念.在我的探索中,我发现许多有关DDD的教程过 ...

  2. 【路由器】Breed 介绍、刷入和使用

    目录 介绍 文件说明 刷入 Breed 通过 Breed 刷机 其他功能 参考资料 介绍 Breed 是国内个人 hackpascal 开发的闭源 Bootloader,也被称为"不死鸟&q ...

  3. 三维模型OBJ格式轻量化压缩变形现象分析

    三维模型OBJ格式轻量化压缩变形现象分析 三维模型的OBJ格式轻量化压缩是一种常见的处理方法,它可以减小模型文件的体积,提高加载和渲染效率.然而,在进行轻量化压缩过程中,有时会出现模型变形的现象,即压 ...

  4. Adapter 适配器模式简介与 C# 示例【结构型1】【设计模式来了_6】

    〇.简介 1.什么是适配器模式? 一句话解释:   两个无关联的类,通过实现同一接口或继承对方得到新的适配器类,新的适配器类中通过实现原本类的操作,可达到进行相同的操作的目的. 适配器模式(Apapt ...

  5. MySQL 使用Navicat delete/insert into/update 大量数据表锁死,kill的线程后线程处于killed状态问题解决

    MySQL 使用delete/insert into/update 大量数据表锁死,kill的线程后线程处于killed状态问题解决 实际生产环境问题描述: 使用Navicat备份BigData数据表 ...

  6. 《Docker到Kubernetes容器运维实战》简介

    #好书推荐##好书奇遇季#<Docker到Kubernetes容器运维实战>已经出版.本书帮助读者系统掌握Docker与K8s运维技能.   本书内容 本书分两部分系统介绍Docker与K ...

  7. SpringCloud搭建保姆级教程

    一.搭建服务注册与发现中⼼ 使⽤Spring Cloud Netflix 中的 Eureka 搭建服务注册与发现中⼼ 1.创建SpringBoot应用添加依赖 1.spring web 2.eurek ...

  8. Linux挂载新磁盘

    Linux挂载新磁盘 1. 查看磁盘 # df -lh # 查看磁盘占用情况,同时可以查看已挂载的磁盘及其挂载位置 # fdisk -l # 查看所有的磁盘分区 图中 /dev/sdb 下无分区信息, ...

  9. 实训——基于大数据Hadoop平台的医疗平台项目实战

    文章目录 医疗平台项目描述 数据每列的含义 数据分析业务需求 架构图 成果图 环境搭建 非常感谢各位的认可,最近太多人找我问东问西,故在此进行说明一下: 首先这个是在Linux上基于Hadoop的搭建 ...

  10. Go 常用命令介绍

    Go 常用命令 目录 Go 常用命令 一.Go 常用命令 1.1 go build 1.1.1 指定输出目录 1.1.2 常用环境变量设置编译操作系统和 CPU 架构 1.1.3 查看支持的操作系统和 ...