先贴两个博客:ajthreac yspm,建议结合起来看

\(O(n^3)\):对 \(XX\) 每个长度为 \(n\) 的字串与 \(Y\) 跑 LCS。设 \(f[i,j,k]\) 表示 \(X[i..j],Y[1..k]\) 的 LCS,暴力转移:\(f[i,j,k]=\max(f[i,j-1,k],f[i,j,k-1],[X[j]=Y[i]](f[i,j-1,k-1]+1))\)。

考虑两个性质:

\[f[i-1,j,k]>f[i-1,j-1,k]\Rightarrow f[i,j,k]>f[i,j-1,k]
\]
\[f[i-1,j,k-1]>f[i-1,j,k-1]\Rightarrow f[i,j,k]>f[i,j,k-1]
\]

证明没看懂,这里提供感性理解:

\(f[i-1,j,k]>f[i-1,j-1,k]\) 说明 \(X[j]\) 可以与 \(Y\) 中一个元素匹配,那么移动 \(i\) 对其他部分的影响相同,且不会影响它,那么 \(f[i,j,k]\) 仍 \(>f[i,j-1,k]\),第二个同理。

通过这两个性质可以发现一定存在分割点 \(p[j,k],q[j,k]\) 使 \(f[i,j,k]=f[i,j-1,k]+[i>p[j,k]]=f[i,j,k-1]+[i<q[j,k]]\),用 \(p[j,n]\) 就能 \(O(n^2)\) 递推出 \(f[i,i+n-1,n]\)。

注意这里 \(p,q\) 的两维与上两篇是反的,边界也不太相同。

考虑如何求 \(p,q\)。

设 \(F=f[i,j-1,k-1],P=p[j-1,k],Q=q[j,k-1]\)。分类讨论:

  • \(X[j]\neq Y[k]\)

    • \(P<Q\)
\(i\) \(P\) \(Q\)
\(f[i,j-1,k]\) \(F+1\) \(F+1\) \(F\)
\(f[i,j,k-1]\) \(F\) \(F+1\) \(F+1\)
\(f[i,j,k]\) \(F+1\) \(F+1\) \(F+1\)

其中 \(f[i,j,k]\) 的取值是根据最开始的暴力 DP 转移得到的,根据 \(f[i,j,k]\) 的取值就能得出 \(p[j,k]=Q,q[j,k]=P\)

其余三类也可以写出类似的表格,注意 \(X[j]=Y[k]\) 时 \(f[i,j,k]=f[i,j-1,k-1]+1\),这里就不一一列出了。

代码异常简洁:

const int N = 4e3+5;
int n;
char a[N],b[N]; int m,ans,p[N][N],q[N][N]; signed main() {
scanf("%d%s%s",&n,a+1,b+1); m = n+n; memcpy(a+n+1,a+1,n);
For(j,1,m) p[j][0] = j;
For(j,1,m) For(k,1,n) {
int P = p[j][k-1], Q = q[j-1][k];
if( a[j] != b[k] && P > Q ) p[j][k] = P, q[j][k] = Q;
else p[j][k] = Q, q[j][k] = P;
}
For(i,1,n) {
int now = 0;
For(j,i,i+n-1) now += i>p[j][n];
ckmax(ans,now);
}
write(ans);
return iocl();
}

SDOI2021集训 R1 半夜 题解的更多相关文章

  1. HihoCoder1338 A Game (区间DP)

    <题目链接> 题目大意: 两个人轮流从一个序列中取数,他们都面临同样的二选一决策:是拿走最左边的数,还是拿走最右边的数?问先手最多能够得到的分数是多少. 解题分析: 一道比较经典的DP,因 ...

  2. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  3. 【某集训题解】【DAY 2 T3】与非

    题目描述 作为一名新世纪共产主义的接班人,你认识到了资本主义的软弱性与妥协性,决定全面根除资本主义,跑步迈入共产主义.但是当你即将跨入共产主义大门的时候,遇到了万恶的资本家留下的与非电路封印,经过千辛 ...

  4. Nowcoder | [题解-N165]牛客网NOIP赛前集训营-普及组(第二场)

    啊...表示一大早还没睡醒就开始打比赛(开始前一分钟的我还在桌子上趴着休眠)...表示题目思路清奇(尤其C题)...但是我还是太蒻了...\(D\)题暴力都没打...题解正式开始之前先\(\%\)一下 ...

  5. R1题解

    估分 大佬们都去写题解了,我不写可能会被老师训诶.... 预计分数:100 + 100 + 5 + 100 + 25 + 100 = 430 实际 :80 + 100 + 0 + 100 + 25 + ...

  6. 暑假集训——cf热身赛部分题有感加其题解

    刚刚开始集训,集训队队长暂时还没有拉专题,而是拉了部分codeforces上过题人数在2000左右的题组成了一场热身赛(其实就是一场练习),花了一天时间终于把它刷完了,其中很多题让我学到了很多骚操作, ...

  7. Yali7月集训Contest2 T1 Cube 题解

    题目链接: 连我们都只有纸质题目...话说雅礼集训都是这样的吗... 大意 0维基本图形是一个点 1维基本图形是一条线段 2维基本图形是一个正方形 3维基本图形是一个正方体 4维基本图形是... 求\ ...

  8. SUST_ACM_2019届暑期ACM集训热身赛题解

    问题A:Hello SUST! 知识点:基本输入输出 C/C++: #include <stdio.h> int main() { int n; scanf("%d", ...

  9. HZNU-ACM寒假集训Day12小结 数论入门 题解

    算不出的等式 BJOI2012 看到这题 真没什么办法 无奈看题解 1.注意到p/q 联想到斜率 2.注意到 [ ] 联想到整点 注意到k在变化,构造一次函数 f(x)=p/q*x ,g(x)=q/p ...

随机推荐

  1. RHCSA_DAY10

    分区过程 添加新硬盘--分区--格式化文件系统--挂载使用 扇区是磁盘存储数据的最小单元,默认一个扇区可以存储512字节的数据 磁盘类型介绍 IDE接口类型:主要用于个人家用计算机领域,优点价格便宜, ...

  2. xubuntu下制作自定义的ISO文件

    by han; 1.打开命令编辑器,建立文件 # sudo su # mkdir -p /opt/custom_conf/user_custom_conf/config 2.将自定义的设置复制保存到/ ...

  3. hg的常用配置

    hg的配置文件分为全局配置和每个Repo自己的配置,Ubuntu系统下全局配置文件是~/.hgrc,Win7系统下是C:\Users\chad\mercurial.ini,各repo的配置文件是$RE ...

  4. 通过白码SQL数据库对接功能改进原系统

    前言: 之前提到过之所以要使用数据库对接功能,就是因为原有系统上有些功能存在不完善甚至不好用的情况,需要二次开发来优化业务流程或是直接用白码用户端上的通用功能.对接了之后就不需要再写代码来搭建或者优化 ...

  5. 【翻译稿】Behavior Driven Development (BDD)行为驱动开发

    这是一篇翻译稿,方便给不知道BDD的同学扫盲.原文链接:What is BDD (Behavior Driven Development)? | Agile Alliance Definition定义 ...

  6. Java序列化bean保存到本地文件中

    File file = new File("D:\\softTemp\\student.out"); ObjectOutputStream objectOutputStream = ...

  7. 关于c#:如何在不同的命名空间中处理相同的类名?

    How to handle same class name in different namespaces? 我正在尝试创建一个通用的库结构. 我通过为我想要的每个公共库创建单独的项目来做到这一点 我 ...

  8. com 组件的本知识

    (今日看到网络上关于"COM中GUID......"文章,写的好,故记录之.)当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一:第一种是采用和Int ...

  9. linux 端口80占用问题

    主要是搭建一次ghost博客网站改成80端口无法启动提示被占用. 提示:80端口被占用,启动失败. netstat -ano 或者 netstat -apn | grep 80 没有发现占用80端口的 ...

  10. 虚拟机--第一章走进java--(抄书)

    这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第一章走近java 世界上并没有 ...