ABC082 D問題 : FT Robot

問題. FT Robot

二次元平面上の原点に  x 軸の正方向を向いているロボットがいる.命令列 s を先頭から順番に実行していく.現在見ている命令が 'F' ならば今向いている方向に1だけ進み,'T' ならば時計回りか半時計回りに向きを変える.命令列 s を実行して  (x, y) へ移動することができるか判定せよ.

制約 1 \le |s| \le 8,000,  |x|, |y| \le |s|

解法. 動的計画法

解けなかったのでEditorial [1] を参考にした.
現在どの命令まで実行したのかと,二次元平面上の点でどの方向を向いているのかを状態として,原点から移動可能かどうかを動的計画法で実行すると  O(n^3) 時間かかる.
まず,現在までの命令までに 'T' を何回実行したかで  x 軸方向に進むのか,  y 軸方向に進むのかが分かるので,どの方向を向いているのかの状態は必要ない.また,命令 'F' を実行するときは, x 軸方向か  y 軸方向かのどちらか一方にしか進まないので,独立に到達可能かを計算できる.よって,状態数はどの命令までを実行したのかと,1次元上での座標で  O(n^2) となり,各状態での遷移は2方向なので  O(1) である.したがって,全体で  O(n^2) 時間で計算できる.

実装は,先頭から命令を順番に実行した.このとき,命令 'F' を読むごとに遷移をして WA となりハマったので,連続する 'F' を数えて一気に移動するという実装を行った.

計算時間 O(n^2)

まとめ

今回の問題は, f_x(i, x) f_y(i, y) が真ならば  (x, y) に到達可能となることがミソっぽい. f_x(i, x) f_y(i, y) も真だけど, (x, y) には到達できないとなると状態として平面上の点が必要.
解けなかったけど面白い問題.