「みんなのプロコン 2019」:F - Pass

問題

https://atcoder.jp/contests/yahoo-procon2019-qual/tasks/yahoo_procon2019_qual_f

考え方

操作の結果の文字列を考えていく。ある文字列が構成されていると仮定したときに次の文字を置くことができる場合は、赤/青のボールごとに考えればシンプルに求めることができる。

DPを考えよう。合計で赤い R のボールが R 個、青い B のボールが B 個あるとする。

dp[r][b] := 結果の文字列で Rr 個、 Bb 個使うときの場合の数

と定義しよう。このとき次の文字列になりうることができる場合を考えよう。赤いボールの場合について考える。r+b 個の文字列が構成されていて、次の文字列になりうるのは、 r+1 番目の赤いボールを r+b 番以内のすぬけ君が持っている場合である。青いボールの場合も同様に考えることができる。

DP初期値は dp[0][0] = 1 である。

DP遷移は以下のように考えることができる。

  • dp[r+1][b] += dp[r][b]
  • dp[r][b+1] += dp[r][b]

解は dp[R][B] となる。

Submission #4277743 - Yahoo Programming Contest 2019

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

操作を直接考えるのではなく、最終的な文字列を構成できる場合の数の考えると見通しがよくなる。

何がバグっていたか

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

  • 状態を仮定して、次の状態へ遷移できるかどうか考える
  • 結果の場合の数を数え上げる

類題