当前位置:网站首页 > 编程语言 > 正文

环形队列的基本运算(环形队列基本运算的实验原理)



Update 2024.11.6

  • 突然发现一个错误,应该是:只需要保证在加入 的时候, 已经有值了即可。

经过和 @gza 和 @ORzyzRO 的讨论应该会了这道题。谢谢你们。

前置知识:杨表基础知识,还有 Robinson–Schensted 对应(即两个形状相同的标准杨表与一个排列一一对应)

对于官方“状态数较少”的解释(来自 @masterhuang):在本题限制下杨表的形态数为 走到 的方案数。

在原题中,给定了最长递增子序列 (LIS = A) 和最长递减子序列 (LDS = B) 的长度,并且 的长度为 ,因此 的标准杨表形状是唯一确定的,就是一个 A * B 的杨表扣掉右下方的格子。

的限制即最后一个填的会使其恰好变成一个 A * B 的矩形,等价于要求 的杨表 满足(这个可以考虑 的插入过程):

注意:只对于最终得到的杨表 1,即 RSK 插入得到的杨表有这个限制,但对于另一个的限制只有形状相同!!!

我们考虑对于一个符合的杨表,直接按从小到大的数来确定它,具体而言:我们假设当前得到的是只考虑 的杨表,形状为 (即每行分别有几列),加入 ,枚举加入在哪一行的末尾,得到一个新的杨表。

请注意:我们不是按照插入的顺序构造杨表,而是直接拓展原本的杨表!!!

只要一直加在轮廓线上就可以满足杨表的性质,同时我们要保证 的限制(上文已经转化成对杨表的值的等价限制),那么只需要保证在加入 的时候, 已经有值了即可。

官方题解

给定整数 、 和 。

有多少种排列 满足以下所有条件?请将结果对 取模。

  • 的最长递增子序列的长度为 。
  • 的最长递减子序列的长度为 。
  • 存在一个整数 ,将 添加到 的末尾不会改变 的最长递增子序列和最长递减子序列的长度。

本题是考察 Robinson–Schensted 对应的练习题。

关于 Robinson–Schensted 对应的解释,国际读者可参考 英文维基百科。

在原题中,给定了最长递增子序列 (LIS) 和最长递减子序列 (LDS) 的长度,并且 的长度为 ,因此 的标准杨表形状是唯一确定的。

具体来说,该形状为一个矩形,有 行和 列,右下角的方格被移除。设 表示从上到下第 行、从左到右第 列的方格, 表示写在方格 上的数字。当前方格包含 ,且满足 和 。

考虑第三个条件。由于 LIS 和 LDS 长度不变,将 添加到 末尾会生成一个形状为 的杨表。设 表示生成后的杨表中方格 上的数字,需要满足:

为了满足这些条件,原来的 必须满足:

综上所述,我们只需统计满足以下条件的 的数量:

  • 包含从 到 的所有整数,

在没有第四个条件的情况下,可以使用钩长公式轻松求解结果,但第四个条件会使得问题更复杂。

在本题中,给定的约束足够小,可以使用动态规划 (DP) 进行求解,其中 的值依次为 填充。最多存在 个状态,因此通过适当的实现可以快速运行。

题目要求找到满足 LIS 和 LDS 长度要求的排列数量。由于 Robinson–Schensted 对应提供了一种将排列映射到杨表形状的方法,我们可以确定每种满足 LIS 和 LDS 长度的排列对应的杨表形状,并对该形状上的数字填充问题进行求解。通过动态规划和钩长公式,我们能够快速计算出满足条件的排列数量。

到此这篇环形队列的基本运算(环形队列基本运算的实验原理)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 单片机程序流程图如何描述(单片机程序流程图如何描述的)2025-01-04 16:54:08
  • 本机信息安装包在哪里(安装信息文件在哪里)2025-01-04 16:54:08
  • 左斜杠和右斜杠有什么区别 英文中(左斜杠和右斜杠有什么区别 英文中文翻译)2025-01-04 16:54:08
  • 国内怎么换ip(国内怎么换美元)2025-01-04 16:54:08
  • 打印机共享补丁卸载(删除共享打印机后再添加时找不到了)2025-01-04 16:54:08
  • 回环地址是什么(lo回环地址)2025-01-04 16:54:08
  • 条件变量虚假唤醒的原因(条件变量 虚假唤醒)2025-01-04 16:54:08
  • 返回上级目录可选用(返回上级目录可选用什么字段)2025-01-04 16:54:08
  • 网页传输工具怎么用(网页传输工具怎么用不了)2025-01-04 16:54:08
  • ubuntu安装源码包(ubuntu下载源码包)2025-01-04 16:54:08
  • 全屏图片