就在前天,你朋友那其實是億萬富翁吸血鬼的曾曾曾曾祖母過世了,你朋友成為了她所有的財產的繼承人。身為你朋友的朋友,你當然想要分一杯羹,便與他一起前往了他曾曾曾曾祖母的金庫。
到了金庫面前,看著一個巨無霸密碼鎖,你朋友頓時發現他並不知道金庫的密碼是什麼!如果他不知道金庫密碼,他就無法獲得他曾曾曾曾祖母的巨額財產,你也更無法分一杯羹,因此你決定要幫助他找到這個金庫密碼。
這個金庫的密碼鎖上寫著 $0$ 到 $100$ 之間的所有整數,其中一個就是這座金庫的密碼。當然,他的曾曾曾曾祖母也不是什麼提示都不留。在金庫外面寫著三行字,最上面那行是文字,下面兩行則是兩個由 $1$ 到 $5 \times 10^ 5$ 之間的整數所形成的序列,數字序列的兩行中的第一行有 $n$ 個數字,第二行有 $m$ 個數字。最上面那行的文字則寫著:
金庫的密碼是下面兩個序列的最長共同子序列的長度。
「最長共同子序列?那是什麼?」你問道。
你朋友笑了一笑解釋道,對於兩個序列 $A, B$ (分別長度為 $s, t$),$A$ 是 $B$ 的子序列代表存在一系列的索引 $1 \le i_1 < i_2 < \dots < i_s \le t$,滿足對於所有 $j$, $A_{j} = B_{i_j}$。對於兩個序列 $B, C$,$A$ 是他們的共同子序列代表 $A$ 是 $B$ 的子序列,也同時是 $C$ 的子序列。兩個序列 $B, C$ 的最長共同子序列則是這兩個序列的共同子序列中,長度最長的一個。
「但是有一個大問題,」你朋友眉頭一皺說道。
「我不會算最長共同子序列的長度。」
俗話說得好,朋友的朋友就是敵人,也就是你是你的敵人。你相信,能跟你棋逢敵手的這個敵人,一定是能算出最長共同子序列的長度的。因此,為了你的朋友,與你的荷包,請你解出這個問題吧!
如果你很討厭你朋友的曾曾曾曾祖母,那麼以下是一個簡易的題目敘述:
給定兩個由 $1$ 到 $5 \times 10^ 5$ 之間的整數所構成的序列,第一個序列長度為 $n$,第二個序列長度為 $m$,請計算出這兩個序列的最長共同子序列的長度,保證答案不超過 $100$。
輸入共有三行,第一行包含兩個正整數 $n, m$,表示兩個序列分別的長度。第二行有 $n$ 個介於 $1$ 與 $5 \times 10^ 5$ 之間的整數,代表第一個序列的元素依序是什麼。第三行有 $m$ 個介於 $1$ 與 $5 \times 10^ 5$ 之間的整數,代表第二個序列的元素依序是什麼。
輸出一個整數,代表給定兩個序列的最長共同子序列的長度。
5 4 1 2 3 4 5 2 4 5 3
3
6 5 1 2 1 3 2 1 2 1 1 3 1
4
3 3 1 2 3 4 5 6
0
範測 1 解釋:$(2, 4, 5)$ 是一個長度為 $3$ 的共同子序列。長度 $4$ 的共同子序列必須是整個第二個序列,可以驗證那不是第一個序列的子序列,因此答案是 $3$。
範測 2 解釋:$(2, 1, 3, 1)$ 是一個長度為 $4$ 的共同子序列。長度 $5$ 的共同子序列必須是整個第二個序列,可以驗證那不是第一個序列的子序列,因此答案是 $4$。
範測 3 解釋:兩個序列沒有共同出現的數字,所以答案是 $0$。
2026 YTP 高中組決賽 p7
| No. | Testdata Range | Constraints | Score |
|---|---|---|---|
| 1 | 0~2 | 範例測試資料 | 0 |
| 2 | 0~13 | $n, m \leq 2000$ | 3 |
| 3 | 14~21 | 每個整數在各自的序列中最多只出現一次 | 3 |
| 4 | 0~33 | 無額外限制 | 9 |