CF2004G 题解

news/2024/9/19 22:11:46/文章来源:https://www.cnblogs.com/CTHOOH/p/18421472
题意

定义关于数字串 \(s\) 的函数 \(f(s)\) 表示将 \(t\) 切分为 \(m\) 段,要求 \(m\) 是偶数,假设这些字符串分别为 \(t_1, t_2, \ldots, t_m\),有 \(s = t_1 + t_2 + \ldots + t_m\)。定义 \(A^x\) 表示 \(\underbrace{AA\ldots AA}_{x~\text{times}}\),求一种划分方式,使得 \(t_2^{t_1} + t_4^{t_3} + \ldots + t_m^{t_{m - 1}}\) 最短。

现在给定长度为 \(n\) 的字符串 \(S\) 和一个正整数 \(k\),对每个 \(i = 1, 2, \ldots, n - k + 1\),求出 \(f(s[i, i + 1, \ldots, i + k - 1])\)

首先考虑 \(k = n\) 的情况,容易观察到对于 \(i\) 为奇数,\(t_i\) 一定小于 \(10\),否则可以将后一位分给 \(t_{i + 1}\),一定更优。根据该性质,可以考虑 dp 并设计出 dp 方程,设 \(f_{i, j}\) 表示考虑前 \(i\) 位,现在的 \(t_{k}\) 等于 \(j\) 的答案,有转移:

  • 刚刚结束一段 \(t_k\),则 \(j = 0\),有 \(f_{i, j} = \min\{f_{i - 1, k} + k\}\),其中 \(k \in [1, 9]\)
  • 延续关于 \(t_k\) 的选择,对于 \(j \in [1, 9]\),有 \(f_{i, j} = \min\{f_{i - 1, j} + j\}\)
  • 开始一段新的 \(t_k\),有 \(f_{i, t_j} = \min\{f_{i - 1, 0}\}\)

答案是 \(f_{n, 0}\)

注意到这个转移是可以矩乘辅助转移的,可以设计出矩阵:

\[\begin{bmatrix} f_{i, 0} & f_{i, 1} & f_{i, 2} & \ldots & f_{i, 9} \end{bmatrix} \times \begin{bmatrix} +\infty & +\infty & +\infty & \ldots & +\infty \\ 1 & 1 & +\infty & \ldots & +\infty\\ 2 & +\infty & 2 & \ldots & +\infty\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 9 & +\infty & +\infty & \ldots & 9 \end{bmatrix} = \begin{bmatrix} f_{i + 1, 0} & f_{i + 1, 1} & f_{i + 1, 2} & \ldots & f_{i + 1, 9} \end{bmatrix} \]

要把转移矩阵的第一行第 \(t_i\) 列设成 \(0\),注意这里的矩阵乘法为 \((\min, +)\) 运算,即 \(A \times B = C\) 实际上是:

\[C_{i, j} = \min_{k = 0}^9 A_{i, k} + B_{k, j} \]

\(w = 10\),可以在 \(O(nw^3)\) 的复杂度内计算出 \(k = n\) 时的答案,考虑扩展到 \(k < n\) 的情况。

有一个经典 trick(这个 trick 在 P6717 和 P1117 中都有运用),就是将序列按照块长为 \(k - 1\) 分为若干块,这样每一个长度为 \(k\) 的子区间一定都是一块的前缀和一块的后缀拼起来的。

所以可以预处理每个块的前缀积和后缀积,每次查询时乘起来即可。时间复杂度仍为 \(O(nw^3)\)

\(O(nw^3)\) 常数过大,写出来会被卡常,考虑优化。由于矩阵中只有 \(O(w)\) 个位置不是 \(+\infty\),所以对这 \(O(w)\) 个位置分别转移即可,时间复杂度优化到了 \(O(nw^2)\),可以通过。

代码
#include <bits/stdc++.h>using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;constexpr int N = 10;constexpr int inf = 1E9;struct Matrix {std::vector<std::vector<int>> a;Matrix() {Init(0);}Matrix(int k) {Init(k);}void Init(int k) {a.assign(N, std::vector<int>(N, inf));if (k == 1) {for (int i = 0; i < N; ++i) {a[i][i] = 0;}}}auto &operator[](int x) {return a[x];}
} ;Matrix appendr(Matrix pre, int x) {Matrix res;for (int i = 0; i < N; ++i) {for (int j = 1; j < N; ++j) {res[i][0] = std::min(res[i][0], pre[i][j] + j);res[i][j] = std::min(res[i][j], pre[i][j] + j);}}for (int i = 0; i < N; ++i) {res[i][x] = std::min(res[i][x], pre[i][0]);}return res;
}Matrix appendl(Matrix pre, int x) {Matrix res;for (int i = 1; i < N; ++i) {for (int j = 0; j < N; ++j) {res[i][j] = std::min(res[i][j], i + std::min(pre[0][j], pre[i][j]));}}for (int i = 0; i < N; ++i) {res[0][i] = std::min(res[0][i], pre[x][i]);}return res;
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, k;std::cin >> n >> k;std::string s;std::cin >> s;std::vector<Matrix> suf(n);for (int l = 0, r = 0; l < n; l = r + 1) {r = std::min(n - 1, l + k - 2);Matrix res = 1;for (int i = l; i <= r; ++i) {res = appendr(res, s[i] - '0');if (i + 1 >= k) {                  int ans = inf;for (int x = 0; x < N; ++x) {ans = std::min(ans, suf[i - k + 1][0][x] + res[x][0]);}std::cout << ans << " ";}}suf[r] = 1;for (int i = r; i >= l; --i) {suf[i] = appendl(suf[i + (i < r)], s[i] - '0');}}return 0;
}

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

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

相关文章

程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 !

编写技术文章是程序员分享经验和记录学习成果的重要方式。 为了让写作变得更轻松,有许多实用工具可以帮助提升效率,比如 Markdown 编辑器、画图工具等。 接下来,笔者将介绍四款简单实用的工具,帮助程序员更轻松地编写技术文章。1 Typora :Markdown 编辑器 Typora 是一款简…

【专题】2024年9月游戏行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37732 在当今数字化高速发展的时代,游戏行业已然成为了文化与科技融合的前沿阵地。中国游戏行业凭借着不断创新的技术、丰富多元的内容以及日益拓展的市场,正以蓬勃之姿在全球舞台上绽放光彩。阅读原文,获取专题报告合集全文,解锁文末153份…

山东旅游攻略

目录山东概览地形图威海刘公岛 山东概览 地形图威海 刘公岛 最主要看中日甲午战争的遗址 参考视频 https://www.youtube.com/watch?v=55vH8J2s3Ow

基础靶机(CentOS7)自测练习WP

1信息收集 192.168.5.141:8090 open 192.168.5.141:8009 open 192.168.5.141:22 open 192.168.5.141:3306 open 192.168.5.141:6379 open 192.168.5.141:8080 open 192.168.5.141:8899 open 192.168.5.141:9080 open [*] alive ports len is: 8 start vulscan [*] WebTitle htt…

【TSTYFST】我回来了

【置顶】最后的直播,大家能来看 十分感谢…! 大家愿意看到最后的,真的最后十分开心!能和猫雷相遇 愿意喜欢上猫雷 真的十分感谢!十分幸福!那么,再见。我要出发了……!如题。玩傻逼二游玩的。 万一这篇被看见的多了就藏了。以下为博客签名,与博文无关。只要你们不停下来…

nas远程联网访问部署方案

1.注册gemini 注册地址 (注册处有咸鱼验证(点击可知是系统负责人),提供提供你的注册名给Gemini,避免被定时删除账号) 2.开启NAS的SSH功能 以群晖举例,见一下三图,记得应用保存. 3.shell本地连入NAS 可以使用xshell,MobaXterm等进行连入,如果没有shell客户端,可以使用以下客户端…

Windows 调试工具课程

Windows 调试工具课程——在软件万种死法中调试出原因本文是我在集团内部上的课程记录而成的博客内容。在本次课程里面将和大家介绍一些在 Windows 上常用的调试工具,以及调查问题的常见套路。适合于伙伴们入门 Windows 调试 本文以下内容是采用原本课程课件里面的一页页的内容…

Ubuntu 18.04.6 TLS版本安装docker问题

技术问题求助: 版本号: Ubuntu 18.04.6 TLS Docker version 24.0.2, build cb74dfc 使用以上版本的ubuntu安装完成docker,安装完成之后使用docker下载镜像,报以下错误:尝试1:修改镜像源: 新建文件:vim /etc/docker/daemon.json root@ubuntu:~# cat /etc/docker/daemon…

github搭建图床配合typora

github搭建图床配合typora 目录github搭建图床配合typoragithub搭建图床利用PicGo上传图片typora配合实现自动上传 好久没有学习了。。。看到博客园发的求救博客,五味杂陈,除了充个会员,就是写写博客活跃一下,支持一下园子 重拾坚果云,发现之前笔记里很多图片用的公共图床…

数字自然资源领域的实现路径

在数字化浪潮的推动下,自然资源的管理与利用正经历着前所未有的变革。本文将从测绘地理信息与遥感专业的角度,深度分析数字自然资源领域的实现路径。 1. 基础数据的数字化数字自然资源的构建,首先需要实现基础数据的数字化。这包括地形地貌、土地利用、植被覆盖、水资源等自…

易优eyoucms提示“异常登录,不在特定范围内”安全锁导致的

data/conf/uneyousafe.txt 丢一个这个文件,里面空也没事(安全锁就立马失效了) uneyousafe.txt 放在 data/conf/ 目录里扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网…

为什么寄存器需要建立时间和保持时间约束?——从门级角度理解

目录 1.建立时间与保持时间 2.从寄存器的内部结构理解建立时间与保持时间 2.1寄存器的结构 2.2主从锁存器构成的寄存器 2.3传输门构成的寄存器 3.查看寄存器的建立时间和保持时间 文章内容为博主学习记录,如有错误,欢迎在评论区指正。 1.建立时间与保持时间 寄存器的建立时…