杨表学习笔记
首先,什么是杨表?在 OI 中,杨表经常用来刻画一些与 LIS 有关的“偏序”性质,然而杨表在其它的组合表示领域还有许许多多的应用。这里我们先从 k-LDS 问题引入标准杨表,然后讨论杨表在其它的组合领域的应用。
以下内容主要参考自袁方舟 19 年的集训队论文,带有大量个人的口胡与感性理解,但也尽量减少了堆公式,如有不严谨的地方请酌情观看。
Part 1. 杨表引入
定义 k-LDS 序列为最长下降子序列不超过 的序列,我们根据 Dilworth 定理或者自己感性理解一下,可以知道一个排列的最长的 k-LDS 子序列相当于从排列中选出 个不相交的 IS 的最长长度和。
如何同时维护 k 个 IS 呢?我们有一个 的简单做法:考虑扩展求 LIS 的二分栈做法,每次我们插入排列中的后一个元素 ,找到二分栈中第一个大于 的位置替换成 。此时这个被替换下来的数不要丢了,再在下面新开一个二分栈。如果这个二分栈也插入失败了又往下插入。将所有二分栈的数组排成一个斜着的三角形状物,我们就得到了一个优美的二维结构。这个结构前 行的元素和就是我们的答案。输出这个结构,我们可以发现它满足一些更优美的性质:
-
每一行严格递增。
-
每一列严格递增。
-
每一行的长度都不超过上一行。
-
所有数组成一个 阶排列。
我们称这样一种结构为标准杨表。
第四个性质不用说。第一个性质由于我们插入的过程每次二分然后替换显然满足。
第三个性质这样考虑:对插入过程施加归纳,所以如果有两个长度相同的行,如果在前面那行插入没有结束,那么由于归纳条件列严格递增,后面那行的最后一个数比前面那行所有数都要大,你拿前面那行的任意一个数插入肯定不会在这一行结束。
第二个性质呢?由于每次插入之后为了找到下一行中比当前位置更大的数,当前位置肯定不会往右移动,因为由于列递增,往下移动肯定就比当前数大了。所以插入的位置只会往左下移动。容易发现这样列递增的条件就被保持了。
Part 2. 标准杨表与排列的对应关系
Part 1 中,我们构建了一个排列到标准杨表的满射。那么标准杨表可以反过来得到排列的结构吗?
答案是可以的,但我们需要记录下每一次插入操作完后,杨表多出来的那一个格子是哪个。我们考虑直接把每次操作完后新加的那个格子中填入你刚刚进行的操作编号 ,这样我们又得到了一个二维结构 ,我们称它为“记录表”。容易发现记录表也是标准杨表。
我们对这记录表按照值从大到小删除所有的格子,删除的时候考虑做一个插入时的逆过程,每次找出你当前要删除的上一行最后一个比它小的数,将这个位置替换成你要删掉的数,然后递归去删这个数,直到删到第一行。此时你正在删除的数就是之前排列加入的数。
这样,对于两个相同形状的标准杨表(即排列 对应的杨表 ,与记录表 ),我们建立了其到排列的双射。这也被称为 Robinson–Schensted correspondence。
Part 3. 行列对称性
我们忽略杨表中的所有数,只考虑它的形状,称这种结构为杨图。发现杨图的结构就是 Ferrers 图的结构(只不过一个是点,一个是格子),那么杨表有没有跟 Ferrers 图一样有转置的性质呢?
杨表的结构十分对称,对于行和列是没有区别的。我们上面在排列末尾插入可以看成对行插入。我们也可以改成从列插入,这对应到原排列上就是从排列开头插入!
这是因为我们有如下结论:将排列 reverse
一下,它对应的标准杨表就是原来的杨表的转置!
具体证明可以参考袁方舟 19 年的集训队论文,我们记对杨表 行插入一个 的操作得到的结果为 ,列插入的结果为 。,我们只需要考虑到引理 ,然后对着排列两种不同的插入顺序归纳一下就可以了。事实上,也可以考虑用 Dilworth 定理疯狂感性理解。
接下来我们考虑将排列看成 这种形式,那么 reverse
相当于将 ,这样原本的 IS 全部变成了 DS(也就是偏序集取了个反)。所以我们也由这件事情知道了原来杨表的第一列的实际意义就是 LDS 的长度。前 列的长度和就是划分成 个 DS 的最长长度。这再一次显现出杨表关于行和列的对称性。
我们还可以将建立杨表时的小于号改成大于号,发现这也相当于将偏序图取反,但也改变了元素之间的关系,所以此时杨表的形状(即杨图)转置,而内容会变化。这个性质可以更方便地帮我们做一些题。
Part 4. 标准杨表计数
标准杨表这么优美,一些数数狂魔自然会去想它有多少个呢?
回想我们刚刚看到的记录表 ,我们会有这样一个结论:对于一个排列 ,它的逆排列对应的杨表 。也就是说,将排列取逆,那么 就交换!(这又一次体现出杨表优美的对称性)
那么我们考虑只对于满足 的排列计数,显然这种排列的个数正好就是标准杨表的个数。而由我们上面的结论,这种排列满足 。所以我们只需要对合排列,也就是只有一元环与二元环的排列个数就行了!
简单 DP,转移方程就是 。
Part 5. 半标准杨表引入
前面一直在讲标准杨表,那么什么是“不标准”的杨表呢?我们去掉每一行严格递增的限制,改成非严格递增,并且允许杨表中出现重复的数,我们称这种结构为半标准杨表。
半标准杨表没有了标准杨表所拥有的优美的行列对称性,然而从下面的讨论我们依旧可以看出半标准杨表具有的另一种形式的对称性。
考虑一个非负整数组成的矩阵 ,将矩阵写成数对的序列。我们按照行优先遍历整个矩阵,然后将 加入序列末尾 次。
我们对着这个序列 ,将 依次使用上述的行插入算法插入一个杨表 ,同时维护一个记录表 ,只不过这次 记录的是 而非 。
这样 就形成了一个到矩阵 的双射。
我们将 转置,也就是说将我们形成的 序列按从根据 双关键字排序变成根据 双关键字排序,此时它对应的杨表就是 。
也就是说,将 转置,那么对应的杨表 与记录表 交换!(证明可以看袁方舟论文)发现 Part 4 提到的结论就是这个结论的特例。
我们依旧考虑跟 Part 4 一样钦定 ,这样就得到了半标准杨表与对称矩阵 具有一一对应的关系!
Part 6. 钩子公式
如果仅仅关心标准杨表填数时行递增、列递增的性质,有些计数狂魔自然会考虑:给定一个杨图 (其中 是 的整数分拆 ),求其对应的标准杨表的个数。
我们定义钩子函数 为格子 严格下方和严格右方的格子数加上一。那么我们有标准杨表的填数方案个数为:
记 ,考虑算一行的钩子函数之积,我们手玩杨表的图像可以发现:
所以也导出了另一种形式:
Part 7. 钩子公式的证明
袁方舟论文里的证明是直接的代数证明。不过这里还有一个更加易懂的证明。
注意到标准杨表填数问题是一种特殊的拓扑序计数问题。而拓扑计数问题一个经典的指数级做法是每次删去一个 0 入度点递归下去搜索。
在标准杨表这张图中,0 入度点就是我们说的满足 的“边角格子”,我们不妨从上往下将所有的边角记为 ,然后再记 删去 的结果为 。
我们就有杨表计数的递推公式:。我们不妨记 ,于是只需要证明 就可以归纳地完成证明了。
我们考虑证明 ,记对应的 ,发现:
接下来我们考虑赋予这个代数式一个组合意义。
我们定义在杨表上的钩行走为如下过程:
等概率随机一个格子 开始,然后不断的等概率选择一个这个格子严格下方或严格右方的格子走过去,直到走到一个边角格子结束。
那么我们猜想, 的组合意义是钩行走走到 结束的概率。
证明考虑对于 DP 归纳。我们设 (其中 且 严格递增)是钩行走从 开始走过的横纵坐标集合。
那么有 DP 式:
我们归纳性地假设:
带入上面的式子,并约去两边都有的项就得到了:
画画图,发现 显然满足性质 (其中 一定是边角)。于是归纳成立!
这样我们将 的组合意义代入上面 的式子,那个 代表随便选一个起点开始的概率。因此我们就证明了 代表的是钩行走走到 的概率,它们的和自然为 。钩子公式得证!
Part 8. 杨表与网格图
如何解决半标准杨表填数的问题呢?我们可以利用另一个组合结构:网格图上的不交路径组。
考虑对于给定形状 与值域 半标准杨表建与不交路径组建立双射。
具体地,我们定义起点集合为 ,终点集合为 ,考虑每一种不相交路径组。
发现对于第 条路径,如果它往右走一格就在杨表对应的行末尾填入列号对应的数,就满足了半标准杨表的限制,如下图所示(蒯的论文图):
于是我们可以利用 LGV 引理解决一些与半标准杨表计数有关的问题。
(同时标准杨表计数其实也有它的行列式形式,有机会再说)
杨表就先学到这里了,以后如果有机会再来补充。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?