h3mky0's blog

主に競プロについて書きます

Codeforces Round #605 (Div. 3) F. Two Bracket Sequences

問題リンク
codeforces.com

問題概要
文字"(", ")"からなる文字列 s, tが与えられるので, s, tを(連続でなくてもよい)部分列として含むような最小文字数の正規括弧列を出力する.

正規括弧列の定義は次の通り
1. 空文字
2. ある正規括弧列Aが存在して, '(' A ')' のこの順に連結したもの
3. ある空でない正規括弧列 A, Bが存在して, A Bのこの順に連結したもの

考えたこと(解法)

次の動的計画法を考える.
dp[i][j][k] := 文字列sのi番目及び, 文字列tのj番目まで確定しており, 余分なopenがk個あるとき(言い換えるとcloseをk個置ける)の最小文字数

いま文字列sのi番目と文字列tのj番目を見ているとき今置こうとする文字(open, close)と合致していれば, (i, j, k)の値を更新する.
kが0の場合, closeはおけないことに注意する.

以上のアプローチから最小文字数は求められるが, 復元をする必要がある.

値と状態からfor文で適当に復元をしたらWAになったのでmapで状態の遷移を持ってやった. これだと普通に遅いので, ここは練習がいると感じた.

提出コード
codeforces.com