きろく

特筆すべき記録のまとめ

AtCoder Beginner Contest 130:E - Common Subsequence

問題

atcoder.jp

解法

まず,問題文の解釈から.選んだ部分列の数字を文字列を連結させて読むのではなく,数列としてみたときに等しいものの個数を求める.例えば {1, 3, 3, 3} と {1333} は,各項を文字列としてみて連結させると同じものになるが,数列としてコンマ区切りで見ると当然同じではない.

以下の DP を考える.

dp(i, j) := S_i, T_j までありうる共通の部分列の個数の和

遷移は

dp(i, j) = dp(i - 1, j) + dp(i, j - 1) - dp(i -1, j - 1) (S_i == T_j のとき + dp(i - 1, j - 1) を追加でする)

となる.- dp(i - 1, j - 1) をしているのは,dp(i - 1, j) と dp(i, j - 1) の中で dp(i - 1, j - 1) を重複して数えてしまっているため.全体で O(NM).

解答

atcoder.jp

問題文の解釈を間違っていたため Virtual コンテスト中に解けなかった...

f:id:babcs2035:20190712131704p:plain