AtCoder Regular Contest 097:E - Sorted and Sorted

問題

https://atcoder.jp/contests/arc097/tasks/arc097_c

考え方

状態を決め打ちできるかどうかが一番重要な考察な気がする。つまり

dp[i][j] := 左から [1,i] までの黒 'B' の数と [1,j] までの白 'W' の数が正しく並べるようにするときの最小のswap回数

と定義すると、その次に置くべき数は一意に決まるのでDPで解を求めることができる。dp[i][j] としたときに 'B' を次に置くのであればその数は i+1 であるし、'W' であれば j+1 である。

よってDPの形は以下のようになる。

dp[i+1][j] = min(dp[i+1][j], dp[i][j] + (黒の i+1 を整列した数列の一番右までswapさせるときの最小の回数))
dp[i][j+1] = min(dp[i][j+1], dp[i][j] + (白の j+1 を整列した数列の一番右までswapさせるときの最小の回数))

次にそれぞれのコストを求めていく。「黒の i+1 を整列した数列の一番右までswapさせるときの最小の回数」について考える。これは位置 k において i+1 よりも大きい数の黒 'B' の数と、位置 k において j よりも大きい数の白 'W' の数の和である。よってそれぞれの色ごとに O(N2) で超えている数の個数を求めて累積和を取ることで位置 k における i(j) よりも大きい数の個数が求められる。

また黒の数 i 白の数 j の位置 k も前計算して求めておくことでDPの遷移のコストが O(1) で求められるようになった。

Submission #4228636 - AtCoder Regular Contest 097

どこに着目して考察するべきだったか

左から確定状態を決め打ち仮定することで、順に条件を満たす数列のコストが求められることに気づく必要がある。

何がバグっていたか

得た知見(典型ポイント)

  • 左から状態を決めていく
  • O(n2)のときに dp[i][j] としてDPする

類題