#P14732. [ICPC 2022 Seoul R] Shuffle Game

[ICPC 2022 Seoul R] Shuffle Game

Description

洗牌游戏是庄家和玩家之间的一种简单纸牌游戏。初始时,庄家和玩家都得到一副相同的 nn 张牌。牌堆中的每张牌由四种花色之一(CC, DD, HHSS)和 13 种点数之一(22, 33, 44, 55, 66, 77, 88, 99, 1010, AA, JJ, KKQQ)组成。因此,共有 5252 种不同类型的牌,且相同的牌可以在牌堆中出现多张。将牌分发给庄家和玩家后,庄家首先从自己得到的牌堆中通过任意洗牌方法创建自己的牌堆 XX,并将其展示给玩家。之后,玩家通过以下步骤创建牌堆 YY:初始时 YY 为空。

步骤 1. 从玩家得到的牌堆中创建两个牌堆 P1P1P2P2P1P1P2P2 中的牌数可以不同。

步骤 2. 交错合并 P1P1P2P2。即,将 P1P1P2P2 底部的牌移至 YY 的当前顶部,直到 P1P1P2P2 中都没有牌为止。注意,玩家不需要交替地将 P1P1P2P2 中的牌移至 YY。此外,由于庄家和玩家都从相同的 nn 张牌堆创建自己的牌堆,YY 总是由与 XX 相同的牌组成。

我们将一个牌堆的序列定义为从底部到顶部牌的顺序。那么玩家的得分定义为序列 XXYY 之间的最长公共子序列的长度。例如,假设庄家和玩家都得到 n=5n = 5 张牌的牌堆 (C2,CJ,D5,HA,S7)(C2, CJ, D5, HA, S7)(这里,我们用其序列表示牌堆)。然后庄家创建牌堆 X=(CJ,D5,HA,C2,S7)X = (CJ, D5, HA, C2, S7) 并将其展示给玩家。之后,玩家通过以下方式创建自己的牌堆:(i) 从给定牌堆中创建两个牌堆 P1=(D5,HA)P1 = (D5, HA)P2=(CJ,S7,C2)P2 = (CJ, S7, C2),以及 (ii) 通过交错合并 P1P1P2P2 创建 Y=(D5,CJ,S7,HA,C2)Y = (D5, CJ, S7, HA, C2)。在此示例中,玩家的得分为 33,因为 (CJ,HA,C2)(CJ, HA, C2)XXYY 序列之间的最长公共子序列。现在,在完成步骤 1 后,玩家希望在应用步骤 2 后知道自己可能获得的最大得分。例如,在前一个示例中,XXYY 的最大可能得分为 44,因为可以从 P1P1P2P2 创建 YY(CJ,D5,HA,S7,C2)(CJ, D5, HA, S7, C2)

给定 nnXXP1P1P2P2,请编写一个程序计算玩家可能获得的最大得分。

Input Format

你的程序需要从标准输入读取数据。输入的第一行包含三个正整数 nnppqq (3n5003 \leq n \leq 500, p+q=np + q = n),其中 nn 是初始牌堆中的牌数,ppqq 分别是 P1P1P2P2 中的牌数。接下来的三行中,分别给出庄家的牌堆 XX(包含 nn 张牌),以及玩家的两个牌堆 P1P1P2P2(分别包含 ppqq 张牌)。XXP1P1P2P2 中的每张牌由其花色(大写字母 CCDDHHSS)和点数(22334455667788991010,或大写字母 AAJJKKQQ)表示。同一行中的牌按对应牌堆从底部到顶部的顺序排列。

Output Format

你的程序需要向标准输出写入数据。输出恰好一行。该行应包含玩家在应用步骤 2 后,基于 XXP1P1P2P2 可能获得的最大得分。

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 完成