競プロ典型90問 023 満点の想定解法の解説
Avoid War(★7)
Published in
Sep 13, 2024
023–04b.cppを解説する。
横一列の各マスに情報を入れる
前準備で横一列の各マスに情報を入れるがこれが結構多い。
前準備1
cnt[j]
jの場所を基準にして状態がいくつあるか
state[j][idx]
jの場所を基準にしたidx番目の状態
Map[j][state]
jの場所を基準にした状態stateは、jの何番目か、そこには置けるか
少しややこしいのが j
の場所を基準にした状態には j
に置いたものは含まないこと。
cnt[j]
は、最終的に j
の場所を基準にして状態がいくつあるか。また、カウントの途中では現在値として使用する。
前準備2
各マスの、各状態について以下を設定する。図では2行あるが、書き込みは1行(図で言うと6回)である。ここはマスの添字が i
になっている。
t0
そのマスに置かなかったときの状態
t1
そのマスに置いた時の状態
nex0[i][j]
そのマスに置かない状態は、次のマスの何番目の状態か
nex1[i][j]
そのマスに置いた状態は、次のマスの何番目の状態か。そのマスに置けないなら-1
DP部分
dp[i][j][k]
(i, j)の場所を基準にしてk番目の状態の置き方をするものが何通りか
処理の流れは
dp[0][0][0]=1
開始マスより前には何も置かない状態がひとつある- (0, 0)に置かない情報を
dp[0][1][...]
に書く - (0, 0)に置けるなら置く情報を
dp[0][1][...]
に書く - 繰り返し
- (H-1, W-1)を調べて
dp[H][0][...]
に書く dp[H][0][...]
を調べて出力