👻
キーエンス プログラミング コンテスト 2021 C - Robot on Grid
問題概要
グリッド上のKマスに'D', 'R', 'X'が書かれていて、
- 'D'ならば下
- 'R'なら右
- 'X'なら右、下両方
にすすめる
あいた
解法
こういう和の和をとるみたいな問題では和のとり方をひっくり返すことで考えやすくなることがある
つまり
と考えても結果は同じになる
これは経路上にあるマスは決まっていて、経路上に存在しないマスは任意に決められるという風に考えられる
各経路に対して、経路上に存在しなかった空白マスの個数をxとすると、
経路上に存在した空白マスの個数をdpテーブルに持ってdpをすればこれを解くことができる
-
: 空白マスをk個通ってマス(i, j)に行く行き方dp[i][j][k] - grid[h][w] == 'D' || grid[h][w] == 'X'のとき
dp[h+1][w][k] \mathrel{{+}{=}} dp[h][w][k] - grid[h][w] == 'R' || grid[h][w] == 'X'のとき
dp[h+1][w][k] \mathrel{{+}{=}} dp[h][w][k] - grid[h][w] == ' '(空白)のとき
('D'として割り当てた場合, 'X'として割り当てた場合)dp[h+1][w][k] \mathrel{{+}{=}} 2*dp[h][w]
dp[h][w+1][k] \mathrel{{+}{=}} 2*dp[h][w]
答え:
しかし、これでは状態数がHWKとなってしまい、
上の式を整理する
つまり空白のマスを通った数だけ3で割っている
これは最後に3で割っているが、空白のマスを使って遷移するたびに3で割っても結局は同じことだとわかる
提出コード
Discussion