#P14732. [ICPC 2022 Seoul R] Shuffle Game
[ICPC 2022 Seoul R] Shuffle Game
Description
洗牌游戏是庄家和玩家之间的一种简单纸牌游戏。初始时,庄家和玩家都得到一副相同的 张牌。牌堆中的每张牌由四种花色之一(, , 或 )和 13 种点数之一(, , , , , , , , , , , 或 )组成。因此,共有 种不同类型的牌,且相同的牌可以在牌堆中出现多张。将牌分发给庄家和玩家后,庄家首先从自己得到的牌堆中通过任意洗牌方法创建自己的牌堆 ,并将其展示给玩家。之后,玩家通过以下步骤创建牌堆 :初始时 为空。
步骤 1. 从玩家得到的牌堆中创建两个牌堆 和 。 和 中的牌数可以不同。
步骤 2. 交错合并 和 。即,将 或 底部的牌移至 的当前顶部,直到 和 中都没有牌为止。注意,玩家不需要交替地将 和 中的牌移至 。此外,由于庄家和玩家都从相同的 张牌堆创建自己的牌堆, 总是由与 相同的牌组成。
我们将一个牌堆的序列定义为从底部到顶部牌的顺序。那么玩家的得分定义为序列 和 之间的最长公共子序列的长度。例如,假设庄家和玩家都得到 张牌的牌堆 (这里,我们用其序列表示牌堆)。然后庄家创建牌堆 并将其展示给玩家。之后,玩家通过以下方式创建自己的牌堆:(i) 从给定牌堆中创建两个牌堆 和 ,以及 (ii) 通过交错合并 和 创建 。在此示例中,玩家的得分为 ,因为 是 和 序列之间的最长公共子序列。现在,在完成步骤 1 后,玩家希望在应用步骤 2 后知道自己可能获得的最大得分。例如,在前一个示例中, 和 的最大可能得分为 ,因为可以从 和 创建 为 。
给定 、、 和 ,请编写一个程序计算玩家可能获得的最大得分。
Input Format
你的程序需要从标准输入读取数据。输入的第一行包含三个正整数 、 和 (, ),其中 是初始牌堆中的牌数, 和 分别是 和 中的牌数。接下来的三行中,分别给出庄家的牌堆 (包含 张牌),以及玩家的两个牌堆 和 (分别包含 和 张牌)。、 和 中的每张牌由其花色(大写字母 、、 或 )和点数(、、、、、、、、,或大写字母 、、、)表示。同一行中的牌按对应牌堆从底部到顶部的顺序排列。
Output Format
你的程序需要向标准输出写入数据。输出恰好一行。该行应包含玩家在应用步骤 2 后,基于 、 和 可能获得的最大得分。
5 2 3
CJ D5 HA C2 S7
D5 HA
CJ S7 C2
4
6 3 3
C9 HK SQ SQ H2 CA
CA HK SQ
H2 C9 SQ
4
7 3 4
S9 C10 DJ S6 S7 SA DQ
DJ S6 S7
S9 C10 SA DQ
7
Hint
翻译由 DeepSeek V3 完成
京公网安备 11011102002149号