NOI2015提高组.子串

题目

520. 子串
在这里插入图片描述

思路

设计状态表示 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示 a a a的前 i i i个字符, b b b的前 j j j个字符, 并且已经分割了 k k k个子串的所有方案, 将状态划分为包含第 i i i个字符和不包含第 i i i个字符, 不包含第 i i i个字符的状态是 f [ i − 1 ] [ j ] [ k ] f[i - 1][j][k] f[i1][j][k], 包含第 i i i个字符要按照最后一段的长度进行划分, 状态转移方程如下

f [ i ] [ j ] [ k ] = f [ i − 1 ] [ j ] [ k ] + { f [ i − 1 ] [ j − 1 ] [ k − 1 ] + f [ i − 2 ] [ j − 2 ] [ k − 1 ] + . . . + f [ i − t ] [ j − t ] [ k − 1 ] } f[i][j][k] = f[i - 1][j][k] + \left \{ f[i - 1][j - 1][k - 1] + f[i - 2][j - 2][k - 1] + ... + f[i - t][j - t][k - 1]\right \} f[i][j][k]=f[i1][j][k]+{f[i1][j1][k1]+f[i2][j2][k1]+...+f[it][jt][k1]}

其中 t ≤ j t \le j tj, 计算时间复杂度 1000 × 200 × 200 × 200 = 8 × 1 0 9 1000 \times 200 \times 200 \times 200 = 8 \times 10 ^ 9 1000×200×200×200=8×109会超时, 因此需要进行优化

观察 f [ i − 1 ] [ j − 1 ] [ k ] f[i - 1][j - 1][k] f[i1][j1][k]的状态转移方程

f [ i − 1 ] [ j − 1 ] [ k ] = f [ i − 2 ] [ j ] [ k ] + { f [ i − 2 ] [ j − 2 ] [ k − 1 ] + f [ i − 3 ] [ j − 2 ] [ k − 1 ] + . . . + f [ i − t ] [ j − t ] [ k − 1 ] } f[i - 1][j - 1][k] = f[i - 2][j][k] + \left \{ f[i - 2][j - 2][k - 1] + f[i - 3][j - 2][k - 1] + ... + f[i - t][j - t][k - 1]\right \} f[i1][j1][k]=f[i2][j][k]+{f[i2][j2][k1]+f[i3][j2][k1]+...+f[it][jt][k1]}

我们发现大括号中很大一部分是重合的, 设大括号中的部分是 s [ i ] [ j ] [ k ] s[i][j][k] s[i][j][k], 那么观察到 s [ i ] [ j ] [ k ] = s [ i − 1 ] [ j − 1 ] [ k ] + f [ i − 1 ] [ j − 1 ] [ k − 1 ] s[i][j][k] = s[i - 1][j - 1][k] + f[i - 1][j - 1][k - 1] s[i][j][k]=s[i1][j1][k]+f[i1][j1][k1], 因此可以少枚举一维, 状态转移方程变为 f [ i ] [ j ] [ k ] = f [ i − 1 ] [ j ] [ k ] + s [ i ] [ j ] [ k ] f[i][j][k] = f[i - 1][j][k] + s[i][j][k] f[i][j][k]=f[i1][j][k]+s[i][j][k]

计算空间复杂度 1000 × 200 × 200 × 4 b y t e 1000 \times 200 \times 200 \times 4byte 1000×200×200×4byte, 大约是 400 M B 400MB 400MB, 但是空间限制只有 128 M B 128MB 128MB, 因此空间上也需要优化, 常见的空间优化方式滚动数组

*超过空间限制

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 1010, M = 210, MOD = 1e9 + 7;int n, m, cnt;
string a, b;
int f[N][N][M], s[N][N][M];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m >> cnt;cin >> a >> b;a = " " + a;b = " " + b;f[0][0][0] = 1;for (int i = 1; i <= n; ++i) {for (int j = 0; j <= m; ++j) {for (int k = 0; k <= cnt; ++k) {if (a[i] != b[j]) s[i][j][k] = 0;else if (j) {s[i][j][k] = s[i - 1][j - 1][k];if (k) s[i][j][k] = (s[i - 1][j - 1][k] + f[i - 1][j - 1][k - 1]) % MOD;}f[i][j][k] = (f[i - 1][j][k] + s[i][j][k]) % MOD;}}}int res = f[n][m][cnt];cout << res << "\n";return 0;
}

01 01 01背包优化方式

注意到, 由于每一层状态只与上一层状态有关, 观察状态转移方程 f [ i ] [ j ] [ k ] = f [ i − 1 ] [ j ] [ k ] + s [ i ] [ j ] [ k ] f[i][j][k] = f[i - 1][j][k] + s[i][j][k] f[i][j][k]=f[i1][j][k]+s[i][j][k], 并且 s [ i ] [ j ] [ k ] = s [ i − 1 ] [ j − 1 ] [ k ] + f [ i − 1 ] [ j − 1 ] [ k − 1 ] s[i][j][k] = s[i - 1][j - 1][k] + f[i - 1][j - 1][k - 1] s[i][j][k]=s[i1][j1][k]+f[i1][j1][k1], 也就是说第二维的状态也是取决于比它小的状态, 因此可以优化掉一维, 对于第二维因为要用到比它小的位置的状态, 需要从后向前枚举

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 1010, M = 210, MOD = 1e9 + 7;int n, m, cnt;
string a, b;
int f[N][M], s[N][M];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m >> cnt;cin >> a >> b;a = " " + a;b = " " + b;f[0][0] = 1;for (int i = 1; i <= n; ++i) {for (int j = m; j; --j) {for (int k = 1; k <= cnt; ++k) {if (a[i] != b[j]) s[j][k] = 0;else s[j][k] = (s[j - 1][k] + f[j - 1][k - 1]) % MOD;f[j][k]=  (f[j][k] + s[j][k]) % MOD;}}}cout << f[m][cnt] << "\n";return 0;
}

滚动数组优化方式

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 1010, M = 210, MOD = 1e9 + 7;int n, m, cnt;
string a, b;
int f[2][N][M], s[2][N][M];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m >> cnt;cin >> a >> b;a = " " + a;b = " " + b;f[0][0][0] = 1;for (int i = 1; i <= n; ++i) {for (int j = 0; j <= m; ++j) {for (int k = 0; k <= cnt; ++k) {if (a[i] != b[j]) s[i & 1][j][k] = 0;else if (j) {s[i & 1][j][k] = s[i - 1 & 1][j - 1][k];if (k) s[i & 1][j][k] = (s[i - 1 & 1][j - 1][k] + f[i - 1 & 1][j - 1][k - 1]) % MOD;}f[i & 1][j][k] = (f[i - 1 & 1][j][k] + s[i & 1][j][k]) % MOD;}}}int res = f[n & 1][m][cnt];cout << res << "\n";return 0;
}

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

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

相关文章

医疗智能体通信整合-大模型训练中沟通优化策略研究

一、引言:医疗模型训练的沟通困境 1.1 医疗 AI 发展背景 在数智化浪潮的推动下,医疗 AI 正以前所未有的速度融入现代医疗体系。从智能影像诊断助力医生精准识别病灶,到基于大数据分析的个性化药物研发,医疗 AI 在提升医疗效率、改善医疗质量方面展现出巨大潜力。据相关数据…

存储管理(一)

目录 一、存储管理的功能 1.地址映射&#xff08;地址重定位&#xff09; 2.主存分配和回收 3.存储保护 4.主存扩充&#xff08;虚拟存储&#xff09; 二、程序的装入与链接 程序的装入&#xff1a; 程序的链接 三、连续分配方式 单一连续分配 固定分区分配 动态分…

SpringBoot学习笔记3.27

目录 实战篇第二课 1.注册参数的校验&#xff1a; 学习过程中遇到的问题&#xff1a; 1.什么是正则表达式 2.怎么自定义异常&#xff1f; 1. 创建全局异常处理类 2. 定义响应对象 3. 使用 ExceptionHandler 4. 设置响应状态码 5. 返回统一响应 6. 测试全局异常处理 …

基于springboot+vue的游戏账号交易系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

小测验——合并多个网格文件调用相机参数进行适配

文章目录 一、前言1.1 对于rule1.2 对于ask、agent、edit1.3 对于没有notepad二、代码展示一、前言 1.1 对于rule 对于.cursorrules里面的文件内容,就是从提示词、项目简介、技术架构、目录结构、代码规范这几方面进行介绍 1.2 对于ask、agent、edit 切换模式在聊天框下方…

敏捷测试(Agile Testing)

敏捷测试&#xff08;Agile Testing&#xff09; 敏捷测试是在敏捷开发&#xff08;Agile Development&#xff09;环境下进行的软件测试方法&#xff0c;强调快速反馈、持续测试、团队协作&#xff0c;以确保软件质量贯穿整个开发周期。与传统瀑布模型不同&#xff0c;敏捷测…

FreeRTOS内核实现与应用学习之6——多优先级

在FreeRTOS中&#xff0c;数字优先级越小&#xff0c;逻辑优先级也越小&#xff1b;在任务创建时&#xff0c;会根据任务的优先级将任务插入就绪列表不同的位置。 相同优先级的任务插入就绪列表中的同一条链表中。 要想任务支持优先级&#xff0c;即只要实现在任务切换&#xf…

【C++篇】C++入门基础(二)

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对C感兴趣的…

Mysql架构之日志讲解:redo log,undo log,bin log 日志

一、buffer pool缓冲区 讲日志之前&#xff0c;我们要先认识一下buffer pool缓冲区。 mysql想完成数据的修改&#xff0c;会先从存储引擎层读取数据&#xff0c;把数据读取到服务层进行数据的修改&#xff0c;再通过存储引擎层把数据更新到数据库中。 mysql每次读取数据都会…

容器主机CPU使用率突增问题一则

关键词 LINUX、文件系统crontab 、mlocate根目录使用率 There are many things that can not be broken&#xff01; 如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; 一、问题现象 业务一台容器服务器&#xff0c;近期经常收到cpu不定期抖动告警&#x…

simpleITK - Setup - matplotlib‘s imshow

使用 matplotlib 显示内联图像 在此笔记本中&#xff0c;我们将探索使用 matplotlib 显示笔记本中的图像&#xff0c;并致力于开发可重复使用的函数来显示 SimpleITK 图像的 2D、3D、颜色和标签叠加层。 我们还将研究使用需要输入图像重叠的图像过滤器的微妙之处。 %matplot…

Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!

【今日推荐】超强AI工具库"awesome-mcp-servers"星数破万&#xff01; ① 百宝箱式服务模块&#xff1a;AI能直接操作浏览器、读文件、连数据库&#xff0c;比如让AI助手自动整理Excel表格&#xff0c;三分钟搞定全天报表&#xff1b; ② 跨领域实战利器&#xff1a;…

硬件老化测试方案的设计误区

硬件老化测试方案设计中的常见误区主要包括测试周期不足、测试条件过于单一、样品选择不当等方面。其中&#xff0c;测试周期不足尤为突出&#xff0c;容易导致潜在缺陷未被完全暴露。老化测试本质上是通过加速产品老化来模拟长期使用状况&#xff0c;因此测试周期不足会严重削…

CSS学习笔记5——渐变属性+盒子模型阶段案例

目录 通俗易懂的解释 渐变的类型 1、线性渐变 渐变过程 2、径向渐变 如何理解CSS的径向渐变&#xff0c;以及其渐变属性 通俗易懂的解释 渐变属性 1. 形状&#xff08;Shape&#xff09; 2. 大小&#xff08;Size&#xff09; 3. 颜色停靠点&#xff08;Color Sto…

Java StringUtils工具类常用方法详解

StringUtils是Apache Commons Lang库中一个极其常用的工具类&#xff0c;它提供了大量处理字符串的静态方法&#xff0c;能够简化我们的日常开发工作&#xff0c;提高代码的可读性和健壮性。下面我将详细介绍StringUtils类中最常用的方法及其使用场景。 一、StringUtils的基本…

设计模式(创建型)- 原型模式

目录 定义 类图 角色 优缺点 优点 缺点 应用场景 案例展示 浅克隆 深克隆 定义 原型模式旨在创建重复的对象&#xff0c;同时确保良好的性能表现。它通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;而非使用传统的构造函数创建方式。这种设计…

MQ的数据一致性,如何保证?

1 数据一致性问题的原因 这些年在Kafka、RabbitMQ、RocketMQ踩过的坑&#xff0c;总结成四类致命原因&#xff1a; 生产者悲剧&#xff1a;消息成功进Broker&#xff0c;却没写入磁盘就断电。消费者悲剧&#xff1a;消息消费成功&#xff0c;但业务执行失败。轮盘赌局&#x…

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

简单介绍一下Unity中的ScriptableObject

ScriptableObject的本质 ScriptableObject是Unity引擎中的一个特殊基类&#xff0c;允许你创建不依附于游戏对象的数据容器&#xff0c;以资产(Asset)形式存储在项目中。这些资产&#xff1a; 可在编辑器中创建和配置 在构建后作为资产打包 可通过Resources或AssetBundle加…

ubuntu24.04.2 NVIDIA GeForce RTX 4060笔记本安装驱动

https://www.nvidia.cn/drivers/details/242281/ 上面是下载地址 sudo chmod x NVIDIA-Linux-x86_64-570.133.07.run # 赋予执行权限把下载的驱动复制到家目录下&#xff0c;基本工具准备&#xff0c;如下 sudo apt update sudo apt install build-essential libglvnd-dev …