#54079: Python 題解 - Top-down 遞迴 + 記憶化、Bottom-up + 進位器


ericshen19555@gmail.com (暴力又被TLE)


這題的關鍵在於想到一種狀態表示法來進行多維DP

因為我們每次操作只關心各個 stack 的頂部元素,所以一個絕佳的狀態表示就是用一個長度為 n 的數列(n 為 stack 總數)來記錄「每個 stack 各自 pop 了幾個元素」。
例如,狀態 `[0, 0, 0]` 代表所有 stack 都還沒動過的初始狀態,而 `[1, 0, 1]` 則表示第 1 和第 3 個 stack 的頂部元素已經被 pop 掉一次了。

一旦定義好了狀態,狀態轉移的思路就很顯然了:從當前狀態,尋找任意兩個 stack 頂端字母相同的配對,將它們 pop 掉(對應的狀態數字加一),並把獲得的分數加到新的狀態上。

而我們要求的答案,就是從初始狀態出發,透過一系列轉移所能達到的最大總分。
雖然理論上狀態總數是所有 stack 長度的乘積,對 Python 來說有億點星爆,但實務上很多狀態是根本無法到達的,所以 DP 是可行的。

實作細節與程式碼見完整題解:1. 字母配對