[NOIP2015 提高组] 子串

news/2024/10/3 19:17:08

算法

状态定义

最初显然可以想到
\(f[i][j][k]\) 表示 \(A\) 串前 \(i\) 个, \(B\) 串前 \(j\) 个, 分割了 \(k\) 个子串
但是这样无法递推 \(k\)

于是加上一位 \(f[i][j][k][0/1]\), 最后一维表示是否选择 \(A\) 子串当前这一位, 也就可以递推的计算

状态转移

  • 当前位置不使用
    \(f[i][j][k][0]=f[i-1][j][k][0]+f[i-1][j][k][1]\), 显然

  • 当前位置使用
    \(f[i][j][k][1]=f[i-1][j-1][k-1][0]+f[i-1][j-1][k][1]+f[i-1][j-1][k-1][1] \leftarrow (a[i]==b[j])\)

边界条件

  • 对于A子串前i位,匹配B串第1个字符,那么只可能使用1个字符串,这种情况如果第i位不进行匹配,那么方案数就是之前所有能与第1位匹配的字符,所以 \(f[i][1][1][0]=sum(a[1~i-1]==b[1])\)

  • 同上,但如果B串第一位和A串某一位匹配了话,那么 \(f[i][1][1][1]=1\) 是显然的

答案

即为 \(f[n][m][k][0/1]\)

空间复杂度优化

一眼滚动数组

  for (int i=1;i<=n;i++){swap(now,pre); //交换,只要i改变f[now][1][1][0]=s;//边界1if (a[i]==b[1]) f[now][1][1][1]=1,s++;//边界2,解决了s统计的问题for (int j=2;j<=m;j++){for (int k=1;k<=t;k++){if (a[i]==b[j]){f[now][j][k][1]=((f[pre][j-1][k-1][1]+f[pre][j-1][k][1])%prime+f[pre][j-1][k-1][0])%prime;}//方程2f[now][j][k][0]=(f[pre][j][k][0]+f[pre][j][k][1])%prime;//方程1}}for(int j=1;j<=m;j++)for(int k=1;k<=t;k++)f[pre][j][k][1]=f[pre][j][k][0]=0;//清空}

总结

状态的设计可以从需要递推的项中找灵感
注意初始值一般为一行或一个点

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

昨天放洛谷的图

因为刷不出来以及有人问所以放这了

python多进程debug

代码调试 问题阐述 最近遇到一个python debug多进程的问题 有一个进程A,这个进程会fork出8个进程B,fork join结束后,又会fork出8个进程A。 假设按时间有序,我就只想断fork出的第一个B和第一个进程A,怎么做?(breakpoint just break only once)类似于java多线程调试的意思…

一些数学知识题

欧几里得算法费马小定理 当a,p都是是质数时,a^(p-1)=1(mod p) 证明: 举个例子 a=2,p=5; 1,2,3,4 集合(1) {1,2,3,4...,(p-1)} 2,4,6,8 => %5 => 2,4,1,3 集合(2) {1a%p,2a%p,3a%p,4a%p...,(p-1)a%p} 我们发现{1,2,3,4}和{2,4,1,3}只是…

题解:洛谷P2339 [USACO04OPEN] Turning in Homework G

题目链接:洛谷P2339 [USACO04OPEN] Turning in Homework G 首先我们考虑如何处理到达给定时间后才能交作业这一限制。其实在生活中,我们一般只会考虑什么时候交作业截止 (除了某些卷王),这样我们只用考虑如何在最大结束时间之前交作业,而不是在所有作业都没开始交之前考虑…

独立站如何批量查收录,教你独立站如何批量查收录的简单方法

独立站批量查收录是提升网站SEO效果的重要步骤。以下提供几种简单且实用的方法,帮助你高效地批量查询独立站的收录情况: 一、使用搜索引擎的Site指令结合自动化脚本 了解Site指令: 在搜索引擎(如谷歌)的搜索框中输入“site:域名”(替换为你的实际域名),执行搜索后,可以…

谷歌收录查询工具,告诉你谷歌收录查询工具使用指南

谷歌收录查询工具是网站管理员和SEO专家用于监控和管理网站在谷歌搜索结果中表现的重要工具。以下是一份详细的谷歌收录查询工具使用指南,旨在帮助你更好地了解和使用这些工具。 一、Google Search Console(谷歌搜索控制台) Google Search Console是谷歌官方提供的免费工具,…

『模拟赛』多校A层冲刺NOIP2024模拟赛01

『模拟赛记录』多校A层冲刺NOIP2024模拟赛01Rank 打得还可以总A. 构造字符串 签,但是挂了 40pts。 发现判条件只有相等和不相等,于是想到并查集维护连通块,将强制相同的两个位置的连通块合并,强制不同的先记下,最后统一判断。 重点在细节处理,合并连通块时要将位置靠后的…

虚拟机类加载机制

1. 类加载时机 一个类型(接口/类)从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将历加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,…