1 条题解
-
0
题意理解
我们有一个 的字符网格,包含字母和空格(
_)。规则:
- 每一行有一个阅读方向: 表示从左到右, 表示从右到左, 表示未确定。
- 每一列有一个阅读方向: 表示从上到下, 表示从下到上, 表示未确定。
- 在确定方向后,每行/列会被空格分隔成若干个单词。
- 对于任意一行(或列),该行(列)中所有单词必须同时满足“单词字典序 翻转后的字典序” 或者 同时满足“单词字典序 翻转后的字典序”。
- 我们想求:在所有满足条件的行列方向确定方案中,翻转后也是单词的单词种类数的最小值。
- 如果单词 翻转后是另一个单词 (不同),则 和 各算一次。
- 如果单词是回文,则只算一次。
关键点分析
-
行列方向独立
行的方向只影响行的单词顺序,列的方向只影响列的单词顺序。可以分开考虑。 -
行/列内部的一致性约束
对某一行 ,设方向为 ,那么这一行所有单词 必须满足:- 要么 (字典序)
- 要么 其中 是 的反转。
如果该行方向已固定( 或 ),则必须检查该方向下是否满足一致性条件。
如果该行方向未固定(),我们可以选择 或 ,但必须满足一致性条件。 -
翻转单词计数
我们要求的是最少有多少个单词 满足“ 也在字典中”。
注意:如果 是回文,,它自动满足条件,但只算一次。
如果 ,则 和 都满足条件,所以它们都会计入答案。为了最小化这个数量,我们应尽量让 和 不同时出现,但受行列一致性约束的限制。
-
最小化方法
本质上是一个决策问题:- 对每个未确定方向的行/列,选择方向,使得最终所有单词集合中“ 与 同时出现”的对数最少。
- 由于行列独立,可以分开处理行和列,最后合并计数。
问题抽象
设 是最终所有单词的集合(包括行单词和列单词)。
我们想最小化: $ \sum_{w \in W} [w^R \in W \ \text{且} \ w \neq w^R] + \sum_{w \in W, w=w^R} 1 $ 但注意 和 如果成对出现,它们会分别在 中,所以会被重复计算,除非我们小心处理。
更准确地说,定义: 我们要求 的最小值?不对,因为如果 ,那么 和 都在 中,会被算两次,但题目说“需要被分别计入”,所以就是数 的大小。
所以目标是最小化 。
算法思路
-
提取所有可能的单词
对每一行,考虑方向 和 两种情况,提取单词(按空格分隔)。
对每一列,考虑方向 和 两种情况,提取单词。
注意:方向影响单词的顺序,但不影响单词本身集合(只是反转整个行的字符串再分割),但单词会反转。实际上:
- 行方向 :单词是正序的。
- 行方向 :单词是整行反转后再分割,得到的每个单词是原位置单词的反转形式。
- 列同理。
-
行列方向决策
对于行 ,如果方向已固定,则只能取该方向对应的单词集合;如果未固定,则可以选择两个方向之一。
列同理。 -
一致性检查
对某一行 ,如果选择方向 ,则得到的单词列表必须满足“所有单词 满足 ” 或 “所有单词 满足 ”。
注意:如果该行只有一个单词,则 和 同时成立(因为 或不等时必有一个成立),所以总是可行的。 -
最小化翻转单词数
我们选择行列方向,使得最终所有单词集合 中,满足 的 的数量最小。这可以建模为最小化问题,行列独立,但行列的单词会合并到 中。
由于 ,我们可以枚举所有行的方向组合?不行, 可能很大,但未定行列最多 72,但实际我们可以用 DP 或贪心?其实可以行列独立处理,因为翻转单词只在行内部或列内部成对,或者行与列之间成对。
但注意:一个单词可能同时出现在行和列中,这会影响 是否出现。
已知解法思路(参考)
这是一个经典的最小化“回文对”计数问题,常用二分图建模或2-SAT:
- 对每个未确定方向的行/列,设布尔变量表示方向。
- 一致性条件可以转化为:如果某行选择方向 ,则必须满足 或全部 。
- 目标是最小化 。
可以证明,行列独立选择,但最终 是行列单词的并集。
我们可以预先计算每个单词 在哪些行/列方向选择下会出现,以及 在哪些行/列方向选择下会出现。
然后问题变成:选择行列方向,使得 和 同时出现的 的数量最小。这可以用最小割或带权2-SAT(最小化满足条件的变量赋值)来解。
实现步骤概要
- 提取每个行/列在两种方向下的单词集合,并检查一致性条件是否满足(不满足则禁用该方向)。
- 建立所有不同单词的列表,并记录每个单词 出现的(行/列,方向)条件。
- 对每个非回文单词对 ,如果它们同时出现,会产生代价 2(因为两个都计入答案)。对回文单词 ,如果出现,会产生代价 1。
- 用最小化布尔满足性问题求解,选择方向使得总代价最小。
总结
这道题是一个较复杂的组合优化问题,需要将方向选择的一致性约束和翻转单词的最小化计数结合起来,通过图论模型求解。
- 1
信息
- ID
- 4406
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者