题目链接

题目

题目描述

给出一个长度不超过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 3
thisisabookyouareaoh
4
is
a
ok
sab

输出

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)\)

代码

#include <bits/stdc++.h>

using namespace std;

int sum[207][207], dp[207][47];
string dir[10]; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int p, k;
cin >> p >> k;
string str;
while (p--) {
string tmp;
cin >> tmp;
str += tmp;
}
int n = str.length();
str = '?' + str;
int s;
cin >> s;
for (int i = 1;i <= s;i++) cin >> dir[i];
for (int j = n;j >= 1;j--) {
for (int i = j;i >= 1;i--) {
sum[i][j] = sum[i + 1][j];
bool ok = false;
string tmp = str.substr(i, j - i + 1);
for (int k = 1;k <= s;k++)
ok |= tmp.find(dir[k]) == 0;
sum[i][j] += ok;
}
}
memset(dp, -0x3f, sizeof(dp));
for (int i = 0;i <= n;i++) dp[i][0] = 0;
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= k;j++) {
dp[i][j] = dp[i - 1][j];
for (int u = 0;u < i;u++)
dp[i][j] = max(dp[i][j], dp[u][j - 1] + sum[u + 1][i]);
}
}
cout << dp[n][k] << '\n';
return 0;
}

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. Feign 实现微服务调用及进行服务熔断与降级

    本文为博主原创,未经允许不得转载: 1. Feign 日志级别配置 2. Feign client 封装调用 3. Feign 定义熔断降级方法 4. 通过 FallbackFactory 工厂 实现 ...

  2. 解决python报错:ModuleNotFoundError: No module named '_sysconfigdata_x86_64_conda_linux_gnu'

    技术背景 在上一篇博客中执行过conda的更新以及用conda安装了gxx_linux-64之后,再执行pip的一些指令时,就会给出如下所示的报错: $ python3 -m pip list Tra ...

  3. [转帖]rsync工作原理

    1)软件简介 Rsync 是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件.Rsync 本来是用以取代rcp 的一个工具,它当前由 Rsync.samba.org 维护.Rsy ...

  4. [转帖]MySQL数据类型(decimal的存储大小)

    本来还以为MySQL的数据类型挺简单的,没想到竟然有很多坑,容我仔细道来 MySQL数据类型 整数类型(注意是字节) 浮点型(重点关注decimal) 字符型(注意这是4.x版本的定义,5.x以后已经 ...

  5. [转帖]xtrabackup2.4备份恢复脚本

    https://developer.aliyun.com/article/534230#:~:text=xtrabackup2.4%E5%A4%87%E4%BB%BD%E6%81%A2%E5%A4%8 ...

  6. [转帖]看看 Jmeter 是如何玩转 redis 数据库的

    柠檬小欧 2021-08-31 20:06420 Jmeter 作为当前非常受欢迎的接口测试和性能测试的工具,在企业中得到非常广泛的使用,而 Redis 作为缓存数据库,也在企业中得到普遍使用,那如何 ...

  7. vue混入mixin

    <div id="app"> --{{nick11}} </div> <script> // 全局混入 不需要注册 var m1 = Vue.m ...

  8. 深入学习C#系列文章01---C#3 革新写代码的新方式

    C#3 几乎所有的新特性都是为LINQ服务的,但他们单独使用也非常有用,接下来我们来简单看看C#3 的几个新特性吧. 一.自动实现的属性-----编写由字段直接支持的简单属性,不再显得臃肿不堪. 之前 ...

  9. 在bat中切换盘符

    在bat代码中如何在不同的盘符中切换?直接输入盘符的名字,前面不要加cd,示例 cd %~dp0 d: cd D:\Python37 e: cd E:\Code\KSFramework c: cd C ...

  10. window hadoop yarn任务执行失败:ExitCodeException exitCode=-1073741515

    环境 window server 2019 单机版hadoop3.3.1 和 winutils.exe 异常 winutils.exe task create -m -1 -c -1 continer ...