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で求めることができ、この問題もそのようにして解けます。

投稿日時:
最終更新: