codevs1040统计单词个数(区间+划分型dp)

1040 统计单词个数

 

2001年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 Description

给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)(管理员注:这里的不能再用指的是位置,不是字母本身。比如thisis可以算做包含2个is)。
单词在给出的一个不超过6个单词的字典中。
要求输出最大的个数。

输入描述 Input Description

第一行为一个正整数(0<n<=5)表示有n组测试数据
每组的第一行有二个正整数(p,k)
p表示字串的行数;
k表示分为k个部分。
接下来的p行,每行均有20个字符。
再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)
接下来的s行,每行均有一个单词。

输出描述 Output Description

每行一个整数,分别对应每组测试数据的相应结果。

 

样例输入 Sample Input

1
1 3
thisisabookyouareaoh
4
is
a
ok
sab

样例输出 Sample Output

7

 

/*
每读取一行可以用strcat把字符串连在一起
从字符串A中搜索单词word可以用char *p=strstr(A,word);
返回NULL则找不到,顺带可以用p-A==0来判断单词是否从A[0]开始匹配。
先预处理出w[i][j],表示从i到j的单词数。可以倒着推,w[i][j]=w[i+1][j];
(如果存在从A[i]字母开始的单词,则w[i][j]=w[i+1][j]+1.出现同一字母开头的多个单词也还是加1就够了.)
F[i][j]表示前i个字母分成j段得到的最大单词数,答案是F[len][k],
可以初始化一下F[i][i]和F[i][1]. 方程F(i,j)=max{ F(r,j-1)+w(r+1,i) (r=j...i-1) }. 
意思就是把1..r的字母先分成j-1段,剩下的r+1..i的字母分成另一段。
*/#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;
int p,k,s,len,w[2005][2005],f[2005][450];
char A[2050],str[250],Word[100][2005];void Input()
{scanf("%d%d",&p,&k); len=20*p;while(getchar()!='\n');while(p--){scanf("%s",str);strcat(&A[1],str);}scanf("%d",&s);while(getchar()!='\n');for(int i=1;i<=s;i++) cin>>Word[i];
}int have(int x,int end)
{for(int i=1;i<=s;i++){char *p=strstr(&A[x],Word[i]);if(p!=NULL && p-&A[x]==0 && strlen(Word[i])<=end-x+1) return 1;}return 0;
}void Init()
{for(int j=len;j>0;j--)for(int i=j;i>0;i--)if(have(i,j)) w[i][j]=w[i+1][j]+1;else w[i][j]=w[i+1][j];
}void DP()
{for(int i=1;i<=k;i++) f[i][i]=f[i-1][i-1]+w[i][i];for(int i=1;i<=len;i++) f[i][1]=w[1][i];for(int i=1;i<=len;i++)for(int j=2;j<=k && j<=i;j++)for(int r=j;r<i;r++)f[i][j]=max(f[i][j],f[r][j-1]+w[r+1][i]);
}int main()
{int t;cin>>t;while(t--){Input();Init();DP();printf("%d",f[len][k]);}return 0;
}
心若向阳,无谓悲伤

 

转载于:https://www.cnblogs.com/L-Memory/p/6351777.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

翻译词典推荐

前言 今天在看一个API&#xff0c;遇到一些生词不会&#xff0c;花了些时间在选择词典上面&#xff0c;做个总结。 我的经历 先说说我使用词典的经历吧&#xff1a; 无网络条件&#xff1a;首选金山词霸&#xff0c;词霸本身1G多安装包配合将近2G的词典包&#xff0c;即便是断网…

用URLGather来管理和保存你的页面

下载链接&#xff1a;http://url-gather.software.informer.com/download/#downloading安装的过程简单&#xff0c;这里不一一叙述。安装成功后&#xff0c;找到软件安装的路径&#xff0c;如下&#xff1a;进入软件之后&#xff0c;你只要熟悉以下的功能就能轻松的管理你的网站…

Exynos4412 中断处理流程详解

Linux 中&#xff0c;当外设触发中断后&#xff0c;大体处理流程如下&#xff1a; a -- 具体CPU architecture相关的模块会进行现场保护&#xff0c;然后调用machine driver对应的中断处理handler&#xff1b; b -- machine driver对应的中断处理handler中会根据硬件的信息获取…

Exynos4412 中断驱动开发相关问题总结

1、Linux 中如何标识一个外部中断&#xff1f; 在linux kernel中&#xff0c;我们使用下面两个ID来标识一个来自外设的中断&#xff1a; a -- IRQ number CPU需要为每一个外设中断编号&#xff0c;我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID&#xff0c;和硬…

Exynos4412 IIC 总线驱动开发相关问题总结

一 、问题 1、IIC总线上的设备是怎么描述的&#xff1f; struct i2c_client{struct device dev;...};2、IIC总线上的驱动是怎么描述的&#xff1f; struct i2c_driver {struct device_driver driver;};3、IIC总线上的设备和驱动是怎么匹配的 1)、对于 Cortex - A8 通过driver…

sersync+rsync实现实时同步

在分布式应用中会遇到一个问题&#xff0c;就是多个服务器间的文件如何能始终保持一致。一种经典的办法是将需要保持一致的文件存储在NFS上&#xff0c;这种方法虽然简单方便但却将本来多点的应用在文件存储上又变成了单点&#xff0c;这违背了分布式应用部署的初衷。为了保留多…

Exynos4412 IIC总线驱动开发(二)—— IIC 驱动开发

前面在Exynos4412 IIC总线驱动开发&#xff08;一&#xff09;—— IIC 基础概念及驱动架构分析 中学习了IIC驱动的架构&#xff0c;下面进入我们的驱动开发过程 首先看一张代码层次图&#xff0c;有助于我们的理解 上面这些代码的展示是告诉我们&#xff1a;linux内核和芯片提…

Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

关于Exynos4412 IIC 裸机开发请看 &#xff1a;Exynos4412 裸机开发 —— IIC总线 &#xff0c;下面回顾下 IIC 基础概念 一、IIC 基础概念 IIC(Inter&#xff0d;Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。I…

Python 爬虫进阶一之爬虫框架概述

综述 爬虫入门之后&#xff0c;我们有两条路可以走。 一个是继续深入学习&#xff0c;以及关于设计模式的一些知识&#xff0c;强化 Python 相关知识&#xff0c;自己动手造轮子&#xff0c;继续为自己的爬虫增加分布式&#xff0c;多线程等功能扩展。另一条路便是学习一些优秀…

1039. 到底买不买(20)

1039. 到底买不买&#xff08;20&#xff09; 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c…

Exynos4412 ADC 设备驱动开发

具体ADC硬件知识及裸机驱动请看&#xff1a; Exynos4412裸机开发 —— A/D转换器 1、原理图如下&#xff1a; 2、相关寄存器信息 ADC_BASE 0x126C0000ADCCON 0x0000 1<<0 | 1<<14 | 0X1<<16 | 0XFF<<6ADCDLY 0x000…

Python 爬虫进阶二之 PySpider 框架安装配置

PySpider官方文档 项目地址 官方文档 安装 phantomjs PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它全面支持 web 而不需浏览器支持&#xff0c;其快速、原生支持各种 Web 标准&#xff1a;DOM 处理、CSS 选择器、JSON、Canvas 和 SVG。 PhantomJS 可以用于页…

Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建

提到中断就必须了解到GIC&#xff0c;下面先了解一下GIC 一、GIC概念 GIC&#xff08;Generic Interrupt Controller&#xff09;是ARM公司提供的一个通用的中断控制器。GIC通过AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;这样的片上总线连接到一个…

Exynos4412 中断驱动开发(二)—— 中断处理流程分析

前面已经学习了中断的注册过程&#xff0c;下面由一张流程图来看一下当中断发生时的处理流程&#xff1a; 中断发生之后处理流程 a -- 具体的CPU architecture相关模块进行现场保护&#xff0c;然后调用machine driver执行对应的中断处理handler; b -- machine driver对应中断处…

Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程

一、中断基础概念 所谓中断&#xff0c;指CPU在执行程序的过程中&#xff0c;出现了某些突发事件即待处理&#xff0c;CPU必须暂停当前的程序。转去处理突发事件&#xff0c;处理完毕后CPU又返回原程序被中断的位置并继续执行。 1、中断分类 a -- 内部中断和外部中断 根据中断的…

rubymine 调试 redmine

1、安装debase和ruby-debug-ide包。&#xff08;注意版本&#xff0c;rubymine 8.0.2下&#xff0c;bitnami下的版本需安装debase -v 0.2.1版本&#xff0c;网上有文章说用debase -v 0.2.2beta6。容易在rubymine启动调试时出现找不到ruby-debug-ide等错误提示&#xff09; 启动…

Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O

阻塞和非阻塞访问、poll() 函数提供了较多地解决设备访问的机制&#xff0c;但是如果有了异步通知整套机制就更加完善了。 异步通知的意思是&#xff1a;一旦设备就绪&#xff0c;则主动通知应用程序&#xff0c;这样应用程序根本就不需要查询设备状态&#xff0c;这一点非常类…

判断链表是否有环

链表有环的情况一般是链表的尾指向前面的节点而不是null&#xff0c;如head->node1->node2->node3->node4->tail->node2&#xff0c;该链表存在环。判断环是否存在可以借助两个指针&#xff0c;一个指针每次迭代只移动一步&#xff0c;第二个指针每次迭代移动…

Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O

在前面学习网络编程时&#xff0c;曾经学过I/O模型 Linux 系统应用编程——网络编程&#xff08;I/O模型&#xff09;&#xff0c;下面学习一下I/O模型在设备驱动中的应用。 回顾一下在Unix/Linux下共有五种I/O模型&#xff0c;分别是&#xff1a; a -- 阻塞I/O b -- 非阻塞I/O…

Python 爬虫进阶六之多进程的用法

python 中的多线程其实并不是真正的多线程&#xff0c;并不能做到充分利用多核 CPU 资源。 如果想要充分利用&#xff0c;在 python 中大部分情况需要使用多进程&#xff0c;那么这个包就叫做 multiprocessing。 借助它&#xff0c;可以轻松完成从单进程到并发执行的转换。mult…