[NOIP2001] 统计单词个数
题目描述
给出一个长度不超过200的由小写英文字母组成的字母串(该字串以每行 20个字母的方式输入,且保证每行一定为 20个)。要求将此字母串分成 k 份,且每份中包含的单词个数加起来总数最大。
每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串 this 中可包含 this 和 is,选用 this 之后就不能包含 th。 单词在给出的一个不超过 6个单词的字典中。
要求输出最大的个数。
输入格式
每组的第一行有两个正整数 p,k。 p 表示字串的行数,k 表示分为 k个部分。接下来的 p行,每行均有 20个字符。再接下来有一个正整数 s,表示字典中单词个数。 接下来的 s 行,每行均有一个单词。
输出格式
1个整数,分别对应每组测试数据的相应结果。
样例输入
1 3
thisisabookyouareaoh
4
is
a
ok
sab
样例输出
7
数据范围与提示
对于 100%的数据,2≤k≤40,1≤s≤6。
基本思路与想法:
分析:
我们可以直接去预处理一下单词个数,然后进行dp即可
状态转移的格式:
f[i][k]=max(f[i][k],f[j][k-1]+a[j+1][i]);
【思路】
DP+字符串:
最优划分。设d[i][j]表示把前i个数划分为j段的最大单词数。则有转移方程:
………………(见上,没记住的面壁思过WAW)
同时即你不管单词的划分,只需统计处总的单词个数(根据题目要求用过的单词首字母不能再用),好像是可以骗分的吧……
PS:
每个字母只可能构成一个单词来贡献答案,暴力处理d[i]为从i开始构成单词的最近位置,O(n*n*6) f[i][j]表示前i个字符分成j组 (你记住了么?) k逆序枚举,w可以顺便递推出来
动态规划 :
f[i,k]表示前 i 个字母,分成k部分的最多单词个数
好像暴力深搜也~能↗↘→过~~~的……吧?(减弱)
恰饭:
#include <bits/stdc++.h>//我爱↗你♂
using namespace std;
int p,k1,t,len;
string s,zd[10];
long long f[200+5][45],a[205][205];
int main(){int i,j,k;string s1;memset(f,0,sizeof(f));memset(a,0,sizeof(a));//基本の初始化cin>>p>>k1;s=""; len=20*p;for (i=0;i<p;i++){cin>>s1;s=s+s1;}cin>>t;for (i=0;i<t;i++)cin>>zd[i];for (j=len-1;j>=0;j--){for (i=j;i>=0;i--){s1=s.substr(i,j-i+1);//后面会说到a[i][j]=a[i+1][j];for (k=0;k<t;k++){if (s1.find(zd[k],0)==0){//也会说FINDa[i][j]++;break;}}}}for (i=0;i<len;i++){for (k=1;k<=min(i+1,k1);k++){for (j=k-2;j<i;j++){int j1=max(j,0);f[i][k]=max(f[i][k],f[j1][k-1]+a[j+1][i]);//再次记忆一哈吧}}}cout<<f[len-1][k1]<<endl; return 0;//养成好习惯(虽然我也不怎么写)
}
最后的循环要注意j>=0 ,也不能盲目max(0,k-2);会出错!!!
PS:
find函数
find() 函数本质上是一个模板函数,用于在指定范围内查找和目标元素值相等的第一个元素。
如下为 find() 函数的语法格式:
字符串名 find (字符串名 first,字符串名 last, const T& val);
其中,first 和 last 为输入迭代器,[first, last) 用于指定该函数的查找范围;val 为要查找的目标元素。
正因为 first 和 last 的类型为输入迭代器,因此该函数适用于所有的序列式容器。
另外,该函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
值得一提的是,find() 函数的底层实现,其实就是用(==
)运算符将 val 和 [first, last) 区域内的元素逐个进行比对。这也就意味着,[first, last) 区域内的元素必须支持(==
)运算符。
PPS:
substr方法用于字符串的截取
两个参数用法:
字符串.substr(参数1,参数2)
参数1(可以是0、正整数、负数)
参数1解释:
如果是0或正整数,则代表字符串截取的起始下标
如果是负数,则代表从倒数第几个字符开始截取
参数2解释:
字符串截取字符的个数(正整数)
如果是0或负数,则会返回空字符串1个参数用法:
1个参数用法:
字符串.substr(参数);
参数:
- 如果是0或正整数:字符串截取的起始下标,默认截取至字符串结尾
- 如果是负数:则从倒数第几个字符开始截取,默认截取至字符串结尾
PPPS:
点个大大的喜欢再走吧
[NOIP2001] 统计单词个数相关推荐
- 开发可统计单词个数的Android驱动程序(2)
开发可统计单词个数的Android驱动程序(1) 五.指定与驱动相关的信息 虽然指定这些信息不是必须的,但一个完整的Linux驱动程序都会指定这些与驱动相关的信息.一般需要为Linux驱动程序指定如下 ...
- 统计单词个数(划分型)
codevs 1040 统计单词个数 2001年NOIP全国联赛提高组 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该 ...
- codevs1040统计单词个数(区间+划分型dp)
1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过2 ...
- c语言编程统计单词的个数,使用c语言如何统计单词个数
使用c语言如何统计单词个数 发布时间:2020-04-21 13:58:58 来源:亿速云 阅读:207 作者:小新 使用c语言如何统计单词个数?相信有很多人都不太了解,今天小编为了让大家更加了解Go ...
- 【codevs1040】【01NOIPTG】统计单词个数,字符串的划分DP
1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过200的 ...
- python输入一个英文句子 输出单词个数_编写程序,给出一个英文句子,统计单词个数。_学小易找答案...
[简答题]叙述pass语句的作用. [简答题]吹风机不工作,可以用万用表检测吗?在网上搜索关键词,吹风机不工作怎么办? [单选题]以下代码运行结果正确的是哪一项?() x=2 if x:print(T ...
- C语言-统计单词个数
目录 1 算法思想 2 实现1 3 实现2 1 算法思想 读取输入进来的一个字符串,统计其中单词的个数,由于每个单词字母不一样,长度不一样,所以来依靠识别单词来统计单词数是比较难的,下面观察一个字符串 ...
- python统计单词个数算法_python 统计单词个数和频次
开始学习python,习题需要统计单词个数和频次.百度找到的代码好像都有问题.自己写了一个,调试通过. 环境:python: 3.9.1 64bit : pycharm: 2020.2 电脑 wi ...
- hadoop 文本统计一个字符的个数_hadoop统计单词个数 - 卡饭网
hadoop入门之统计单词在文件中出现的个数示例 hadoop入门之统计单词在文件中出现的个数示例 Linux环境:CentOs6.4 Hadoop版本:hadoop-0.20.2 内容:统计hado ...
最新文章
- centos7 mariadb mysql max_connections=214 无法修改的问题
- python每一句后面可以加也可以不加分号
- Linux的文本字段统计方法
- IIS中WEB服务器的日志存放到SQL Server 2005中
- 2017年java教材推荐_干货|2017年最新JavaEE课程大纲分享
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
- 开源程序安装框架-BitNami
- php三次握手,深入理解TCP协议及其源代码——三次握手(示例代码)
- mac系统我的世界服务器,我的世界Mac版联机教程
- 计算机基础知识论文统一格式,大一计算机基础知识论文.docx
- MySql作业练习题
- Sumatra PDF 缩放设置
- C++:求平均分(针对基本数据类型的应用)
- 【汽车制造业】“新三化+新能源”蓝海,加速车企数字化转型进入“深水区”
- 小米抢发全尺寸人形机器人,全方面转型!
- 计算机系统崩溃了怎么办,电脑系统崩溃开不了机怎么办
- 夜天之书 #26 Four-Factor OSC
- 数据库高可用架构 - pxc
- slice splice split
- HOOK Windows API