当前位置: 首页 > news >正文

edu 106 E(LCS dp + 多源bfs优化)

E

先考虑对两个固定串怎么做:可以确定形成串的末尾一定是 \(a_{i}\) 或者 \(b_{j}\),直接子序列 \(dp\) 即可:\(dp_{i,j,0/1}\) 表示只考虑 \(a\) 长度为 \(i\) 的前缀和 \(b\) 长度为 \(j\) 的前缀,\(0\) 表示形成的串以 \(a_{i}\) 结尾;\(1\) 表示形成的串以 \(b_{j}\) 结尾,方案数。转移 \(O(n^{2})\)

那么推广到对 \(a\)\(b\) 的所有 子串对 计数,显然不能枚举子串对分别计数。现在考虑:对 \(a,b\) 两个整串作 \(dp\) 后,我们可以得到哪些 子串对 的答案?实际上,我们得到了所有 必须以 \(a[1],b[1]\) 开头,以任意 \(a[i]\)\(b[j]\) 结尾 的 子串对 的方案数 —— 对应于 \(dp\) 状态的每个 \(dp_{i,j}\)。也就是说,目前得到了 左端点固定为开头,右端点任意 的所有子区间的答案。如何扩展到 左端点任意,右端点任意 的情况呢?

暴力枚举左端点对显然是不可取的。考虑上述 \(dp\) 的转移过程:不难发现,转移式与当前串的左端点取什么是没有关系的,只和当前位置和前一个位置相关。这个时候,思考一下多源 \(bfs\):存在多个起点时,可以直接将所有起点先放进队列,然后 \(bfs\)转移过程只和钦定的通行方式有关;最终就可以求得对于所有位置,从任意起点出发的最短路。仔细想一下二者之间的关系,发现:所有可能的左端点对 \((l_{a},l_{b})\) 可以看作是多源 \(bfs\) 的多个起点;并且转移是固定的,和起点的位置无关。因此可以考虑对上述 \(dp\) 转移作类似多源 \(bfs\) 的优化:预先初始化好所有左端点对的dp状态,再直接对整体做一次转移,最终得到的 \(dp_{i,j}\) 便表示 \(a,b\)左端点任意,右端点分别为 \(i, j\) 的所有区间的答案,对所有 \(dp_{i,j}\) 作和即为所求。

需要额外注意的地方:题目明确要求 \(a,b\) 中的子串均非空,但初始化时包含了 \(a,b\) 某一个是空串。因此需要考虑分别去除掉 \(a\)\(b\)非空\(b\)\(a\)非空 的合法情况。二者均可 \(O(n^{2})\) 求得。具体细节见代码。

code

http://www.wxhsa.cn/company.asp?id=7007

相关文章:

  • ABC310E NAND repeatedly 题解
  • MyBatis插入语句配置
  • 操作运算符
  • 看 NOI2025 游记记
  • 整体二分
  • 得力 - Bruce
  • 短视频营销运营导师张伽赫,绳木传媒AI+短视频引领企业数字化变革
  • 详细介绍:还在重启应用改 Topic?Spring Boot 动态 Kafka 消费的“终极形态”
  • 用 TensorFlow 和 CNN 实现验证码识别
  • 用 PyTorch 和 CNN 进行验证码识别
  • 用 Keras 和 CNN 进行验证码识别
  • 从 Bank Conflict 数学表示看 Buffer 设计 Trade-Off
  • 被彼此笼罩 任泪水将我们缠绕 深陷入恶魔的拥抱 在阴冷黑暗处灼烧 吞下这毒药
  • mysql无法连接服务器的mysql #mysql8
  • DAG 最小路径覆盖问题 笔记
  • SP3D c# 开发独立的exe
  • python错误code
  • 瑞 ping 我
  • java八股文笔记 - 指南
  • NOIP 模拟赛十六
  • 【AT_dp_y】Grid 2 - Harvey
  • C#十五天 026多态重写 027抽象类与开闭原则 028接口,依赖反转,单元测试
  • 解题报告-P11844 [USACO25FEB] Friendship Editing G
  • 两种判断计算机大小端模式的方法
  • CSP-S模拟23
  • CF1413F Roads and Ramen
  • 复现The Annotated Transformer代码时遇到的问题和相关链接
  • Node.js 文件上传中文文件名乱码难题,为什么只有Node会有乱码困难,其他后端框架少见?
  • ROS2之节点
  • 9.17日总结