题目链接

题目

题目描述

给出一个长度不超过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. kafka 的基本概念及使用场景

    本文为博主原创,未经允许不得转载: 1. Kafka 的使用场景: 1.日志收集:一个公司可以用Kafka收集各种服务的log,通过kafka以统一接口服务的方式开放给各种 consumer,例如ha ...

  2. NCC Mocha v0.10 发布, .NET 开发的基于 OpenTelemetry 的 APM 系统

    目录 项目简介 项目进度 v0.10 发布内容 项目背景 平台功能 技术架构 v0.10 快速体验 启动项目 Trace 数据的发送 配置 Jaeger 数据源 Trace 数据的查询 项目简介 Mo ...

  3. Julia编程基础

    技术背景 Julia目前来说算是一个比较冷门的编程语言,主要是因为它所针对的应用场景实在是比较有限,Julia更注重于科学计算领域的应用.而Julia最大的特点,就是官方所宣传的:拥有C的性能,且可以 ...

  4. Makefile中的+=、:=、?=

    1.= "="是最普通的等号,然而在Makefile中确实最容易搞错的赋值等号,使用"="进行赋值,变量的值是整个makefile中最后被指定的值.不太容易理解 ...

  5. js - 异步加载图片到 dom

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【水一篇】骚操作之net 6的winform启动的同时启动Net 6 WebApi【同一套代码】

    引言 有段时间没有写博客了,不知道写什么,加上最近一直在玩单片机方面的东西,所以有一些懈怠.首先呢,为什么会有这么一个问题,是在一个QQ群里,有看到有人提问,能不能在启动Winform的同时去启动一个 ...

  7. 如何让你的.NET WebAPI程序支持HTTP3?

    下面我将总结构建Http3的经验,以Token Gateway的项目为例,请注意使用Http3之前你需要知道它的限制, Windows Windows 11 版本 22000 或更高版本/Window ...

  8. [转帖]《Linux性能优化实战》笔记(三)—— CPU 上下文切换(下)

    上篇介绍了三种CPU 上下文切换以及它们可能造成的问题和原因,这一篇来看看在系统中如何发现CPU 上下文切换问题. 一. 查看上下文切换情况 主要使用两个命令:vmstat以及之前用过的pidstat ...

  9. 【如何提高IT运维效率】深度解读京东云基于NLP的运维日志异常检测AIOps落地实践

    作者:京东科技  张宪波.张静.李东江 基于NLP技术对运维日志聚类,从日志角度快速发现线上业务问题 日志在IT行业中被广泛使用,日志的异常检测对于识别系统的运行状态至关重要.解决这一问题的传统方法需 ...

  10. Ant Design Vue 中Drawer自定头部的样式、内容部分的样式、弹出层的样式

    <a-drawer :title="myTitle" placement="right" :visible="visible" @cl ...