题目链接

题目

题目描述

给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份( 1 < k ≤ 40 ),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。

单词在给出的一个不超过6个单词的字典中。

要求输出最大的个数。

输入描述

每组的第一行有2个正整数(p,k)

p表示字串的行数,k表示分为k个部分。

接下来的p行,每行均有20个字符。

再接下来有1个正整数s,表示字典中单词个数。(1 ≤ s ≤ 6 )

接下来的s行,每行均有1个单词。

输出描述

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

示例1

输入

  1. 1 3
  2. thisisabookyouareaoh
  3. 4
  4. is
  5. a
  6. ok
  7. sab

输出

  1. 7

题解

知识点:枚举,线性dp,字符串。

这道题是 \(k\) 串最大和的变形,加和部分变为了字符串最多匹配的数量。

因此先预处理出 \(sum[i][j]\) 表示为区间 \([i,j]\) 的最大匹配数。实现上需要逆推,因为要求是第一个字符不一样的匹配才算,所以逆推一个字符后看从这个字符出发有没有匹配的,有就加一。

设 \(dp[i][j]\) 为考虑到 \(i\) 个字符,共有 \(j\) 串。转移方程为:

\[dp[i][j] = \max(dp[i-1][j],dp[u][j-1] + sum[u+1][i]),0 \leq u \leq i-1
\]

表示不选从 \(s[i]\) 出发的串,选 \(s[u+1,i]\) 作为第 \(j\) 串。

由于不能选空串,因此初始化负无穷,并把初态 \(j = 0\) 赋值 \(0\) 。

时间复杂度 \(O(k|s|^2)\)

空间复杂度 \(O(|s|^2 + k|s| + m)\)

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int sum[207][207], dp[207][47];
  4. string dir[10];
  5. int main() {
  6. std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  7. int p, k;
  8. cin >> p >> k;
  9. string str;
  10. while (p--) {
  11. string tmp;
  12. cin >> tmp;
  13. str += tmp;
  14. }
  15. int n = str.length();
  16. str = '?' + str;
  17. int s;
  18. cin >> s;
  19. for (int i = 1;i <= s;i++) cin >> dir[i];
  20. for (int j = n;j >= 1;j--) {
  21. for (int i = j;i >= 1;i--) {
  22. sum[i][j] = sum[i + 1][j];
  23. bool ok = false;
  24. string tmp = str.substr(i, j - i + 1);
  25. for (int k = 1;k <= s;k++)
  26. ok |= tmp.find(dir[k]) == 0;
  27. sum[i][j] += ok;
  28. }
  29. }
  30. memset(dp, -0x3f, sizeof(dp));
  31. for (int i = 0;i <= n;i++) dp[i][0] = 0;
  32. for (int i = 1;i <= n;i++) {
  33. for (int j = 1;j <= k;j++) {
  34. dp[i][j] = dp[i - 1][j];
  35. for (int u = 0;u < i;u++)
  36. dp[i][j] = max(dp[i][j], dp[u][j - 1] + sum[u + 1][i]);
  37. }
  38. }
  39. cout << dp[n][k] << '\n';
  40. return 0;
  41. }

NC16696 [NOIP2001]统计单词个数的更多相关文章

  1. NOIP2001 统计单词个数

    题三 统计单词个数(30分) 问题描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k&l ...

  2. NOIP2001统计单词个数[序列DP]

    题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...

  3. Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)

    描述 http://codevs.cn/problem/1040/ 与Codevs_1017_乘积最大很像,都是划分型dp. 给出一个字符串和几个单词,要求将字符串划分成k段,在每一段中求共有多少单词 ...

  4. 第六章 第一个Linux驱动程序:统计单词个数

    现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用 ...

  5. 第六章第一个linux个程序:统计单词个数

    第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱 ...

  6. NOIP200107统计单词个数

    NOIP200107统计单词个数 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给出一个长度不超过200的由 ...

  7. luogu P1026 统计单词个数

    题目链接 luogu P1026 统计单词个数 题解 贪心的预处理母本串从i到j的最大单词数 然后dp[i][j] 表示从前i个切了k次最优解 转移显然 代码 #include<cstdio&g ...

  8. Codevs 1040 统计单词个数

    1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过200的 ...

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

    1040 统计单词个数 2001年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 给出一个长度不超 ...

  10. P1026 统计单词个数——substr

    P1026 统计单词个数 string 基本操作: substr(x,y) x是起始位置,y是长度: 返回的是这一段字符串: 先预处理sum[i][j],表示以i开头,最多的单词数: 从后往前寻找,保 ...

随机推荐

  1. Mysql 查询优化及索引优化总结

    本文为博主原创,转载请注明出处: 一.Mysql 索引的优缺点: 优点:加快数据的检索速度,这是应用索引的主要用途: 使用唯一索引可以保证数据的唯一性 缺点: 索引也需要占用物理空间,并不是索引越多越 ...

  2. Angular系列教程之父子组件通信详解

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  3. 问题--如何快速复制Typora(Markdown)中的代码块/区块等

    使用快捷键ctrl+E,选中相同格式的文字,然后快速复制即可

  4. 缓存选型:Redis or MemCache

    ★ Redis24篇集合 1 背景 互联网产品为了保证高性能和高可用性,经常会使用缓存来进行架构设计.最常用的就是使用Redis了,也有部分企业会选择使用Memcache. 所以了解 Redis 和 ...

  5. Java开发者的Python进修指南:JSON利器之官方json库、demjson和orjson的实用指南

    JSON JSON作为目前最流行的传输格式,在Python中也有相应的实现方式.由于JSON格式的文本可以跨平台并且简单易用,因此被广泛传播.因此,我们今天的主要讨论内容是如何熟练地应用Python的 ...

  6. 2023年SWPU NSS 秋季招新赛 (校外赛道) MISC复盘WP

    GIF Code 题目描述: 扫一扫即可获取Flag 给了一个含二维码的动图,分离一下得到九张二维码碎片,根据文件名数字按顺序组装,在线扫码即可 NSSCTF{3f0ac91b-3e0e-a7e2-7 ...

  7. Python Code_02

    author : 写bug的盼盼 development time : 2021/8/27 19:59 变量定义 name = '阿哈' print(name) print('标识',id(name) ...

  8. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.1)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  9. [转帖]鹅厂微服务发现与治理巨作PolarisMesh实践-上

    文章目录 概述 定义 核心功能 组件和生态 特色亮点 解决哪些问题 官方性能数据 架构原理 资源模型 服务治理 基本原理 服务注册 服务发现 安装 部署架构 集群安装 SpringCloud应用接入 ...

  10. GS7 备份恢复之后客户端登录报错的解决方法:COM 类工厂中 CLISID 为 xxxx的组建失败, 原因是出现了一下错误 8000401a

    1. 最近需要创建一个用户的数据库应用信息, 备份恢复之后发现有时候一些环境无法使用. COM 类工厂中 CLISID 为 xxxx的组建失败, 原因是出现了一下错误 8000401a 错误图片为 2 ...