G - Digits on Grid 解説
by
kyopro_friends
NFAが受理する文字列の個数のbitDPによる数え上げ
まず判定問題「文字列 \(X\) を作れるか?」を考えます。これは
\(\mathrm{dp}[i][(r,c)]=\) \(i\) 文字目まで構成した時点でマス \((r,c)\) にいることがあるか?
というDPで解くことができます。まずこのDPを改善します。
次が高橋君の行動である場合、同じ行のマスには移動できるので「いまどの列にいるか」の情報は必要ありません。よってDPテーブルを
\(\mathrm{dp}[i][x]=\) \(i\) 文字目まで構成した時点で \((i\%2?列x:行x)\) にいることがあるか?
として解くことができます。このDPは、答えがYesとなる文字列を受理するNFA(非決定性オートマトン)の遷移をシミュレーションしていることと等価です。
NFAが受理する文字列の数え上げは一般に
\(\mathrm{dp}[i][S]=\) \(i\) 文字目まで読み終わった時点でありえる状態の集合がちょうど \(S\) である文字列の個数
という形のbitDPで求めることができ、この問題もそのようにして解けます。
投稿日時:
最終更新:
