Young tableau
参考博客
本博客全部采用英式画法
杨表 Young tableau
杨表,是一种特殊的图,用于整数划分类问题.
杨图由有限多个相邻的方格排列而成,其中,各横行的左边对齐,长度由下而上递增.若将杨图的各行的方格数列出,则形成总方格数 n n n的一个整数分拆 λ \lambda λ.
杨表的常见画法
- 英式
- 将方格数较少的行排在方格数较多的行的下方
- 臂长定义为其正右方的方格数
- 腿长定义为其正下方的方格数
- 勾长定义为臂长+腿长+1
- 法式
- 将各行由大到小一层一层往上叠
标准杨表
我们定义标准杨表为将 1 , 2 , . . . , n 1,2,...,n 1,2,...,n填入杨表且满足从上到下,从左到右数字都是满足比较方式 < < <的杨表( < < <仅表示一种偏序关系).
钩子公式
设 f ( λ ) f(\lambda) f(λ)表示 n n n的一个整数拆分 λ \lambda λ对应的标准杨表的个数, h o o k λ ( x ) hook_{\lambda}(x) hookλ(x)表示方格 x x x的勾长,那么有 f ( λ ) = n ! ∏ x ∈ Y λ h o o k λ ( x ) f(\lambda)=\frac{n!}{\prod_{x\in Y_{\lambda}}hook_{\lambda}(x)} f(λ)=∏x∈Yλhookλ(x)n!
口胡证明
总的填法是 n ! n! n!种.对于每个方格,其中只有 1 h o o k λ \frac{1}{hook_{\lambda}} hookλ1满足限制.
近似杨表
定义近似杨表为将 n n n个不同的数填入杨表且满足从上到下,从左到右数字都是满足比较方式 < < <的杨表.
如何构造近似杨表-增量算法
增量算法的核心是行插入操作,其与求解LIS的二分解法有相通之处.
行插入操作
定义行插入操作 P ← k P\leftarrow k P←k ,来表示将数 k k k插入近似杨表 P P P
- 记
r
r
r是最小的整数不满足
P
1
,
r
<
k
P_{1,r}<k
P1,r<k.
- 如果找不到这样的 r r r(即第一行都满足 < k <k <k),就把 k k k插入到 P P P的第一行 P 1 P_1 P1的末尾.并结束
- 如果找得到 r r r,则用 k k k替换掉 P 1 , r P_{1,r} P1,r,令 k ′ k' k′表示被替换出来的 P 1 , r P_{1,r} P1,r,我们用同样的规则将 k ′ k' k′插入第二行.
- 反复循环上述流程.直到某个元素添加到了某一行的末尾(可能是新的一行).
证明合法性
插入完之后, k ′ k' k′一定在 k k k下一行的左侧,其他显然没有变,也是合法的.
时间复杂度
显然,对于一个 R R R行 C C C列的杨表,插入 k k k的最坏情况下的时间复杂度为 R log C R\log C RlogC.
RSK算法
留坑不填
一些结论
- 若将其比较方式取反( < < <变 ≥ \geq ≥, > > >变 ≤ \leq ≤),所得杨表为原杨表的转置.
- 排列 π \pi π的最长上升子序列长度等于 π \pi π对应的杨表的第一行长度( < < <).
- 排列 π \pi π的第 i i i行对应 π \pi π去掉 P 1 , p 2 , . . . , p i − 1 P_1,p_2,...,p_{i-1} P1,p2,...,pi−1后的最长上升子序列( < < <).
P3774 [CTSC2017]最长上升子序列
根据狄尔沃斯定理定理(这玩意好像还挺常用的),最长上升子序列长度等于将序列划分为若干不上升子序列的数量的最小值.
所以转化为这样一个问题:对于 B B B的每个前缀,取出不超过 k k k个不上升子序列,求最多能取走多少个数.这个东西即为该序列的不上升杨表中前 k k k行元素数量之和.
暴力可以获得 85 p t s 85pts 85pts的好成绩.
考虑到总的元素个数是 Θ ( n ) \Theta(n) Θ(n)的,这样不存在一个方格满足其行,列都 > n >\sqrt n >n.
这样维护杨表 P P P与其转置 P T P^T PT的前 ⌈ n ⌉ \lceil \sqrt n\rceil ⌈n⌉行即可刻画这个杨表.
等等,出大问题!!!
我们之前所提到的杨表的限制都有前提,即 n n n个数各不相等,但问题是本题的序列 B B B并不满足这一性质.
那么我们钦点对于两个大小相同的数,其出现位置较大的数较小.发现这并不影响最长上升子序列长度,那就没问题了.
实际实现行插入的时候并不用记录这个数的位置,因为此时杨表中所有数都在其之前出现.