みんなのプロコン 2019 E問題:Pass

問題. Pass

 n 人のすぬけ君がそれぞれボールを2個ずつ持って1列に並んでいる.ボールの色はそれぞれ赤か青のどちらかである.各ステップで自分の持っているボールをどれか1つ前の人に渡すというステップを  2 n 回行う.先頭の人が選んだボールの色の列としてありうるものの個数を求めよ.

制約 2 \le n \le 2,000

解法.動的計画法

 r_i b_i をそれぞれ先頭から  i 番目までの人達が持っている赤色と青色のボールの総数とする.ただし便宜上,任意の  j \in (n, 2n] に対して  r_j b_j の値はそれぞれ  r_n b_n と等しいとする.
先頭の人が選んだボールの色の列を  s_1, s_2, \ldots, s_{2 n} としたとき,各  i \in [1, 2n] に対して  s_1, s_2, \ldots, s_i で選んだ赤色と青色のボールの総数はそれぞれ  r_i, b_i 以下でないといけない.そのようなものの個数を動的計画法で求める.具体的には dp[i][j] を,先頭の人がボールを  i 個選んだときに,赤色のボールが  j 個含まれるようなものの数として漸化式を立てる.このとき, j \le r_i を満たし,選ばれた青色のボールの個数が  i - j であることから  i - j \le b_i を満たすように遷移を考える(詳しくはソースコードを参照).

計算時間 O(n^2)

コンテスト中は問題を確認してなかったけど,コンテスト後に見たら解けたのでD問題よりもE問題を解くべきだったなと反省.