TDPC B - ゲーム
考え方
ABCでいうと、難しめD問題級。
最初に入力を反転するとコードが書きやすいので、説明も全て反転した状態に合わせて書く。
Aが残り $i$ 個、Bが残り $j$ 個の場合の得点を求めていく動的計画法で解けそう。
が、問題は値として何を持つか。
その状況での手番がすぬけくんかすめけくんかで、保持する値を変えるのは、複雑。
そこで、少し工夫する。
Aが残り $i$ 個、Bが残り $j$ 個の場合の「先手の点数 $-$ 後手の点数」を持つことにする。
すると、DP は以下のように遷移する。
$$
DP[i][j] =
\begin{cases}
0 & (i=0,\ j=0), \\
b_{j-1} - DP[i][j-1] & (i=0,\ j>0), \\
a_{i-1} - DP[i-1][j] & (i>0,\ j=0), \\
\max\left(b_{j-1} - DP[i][j-1], a_{i-1} - DP[i-1][j]\right) & (i>0,\ j>0).
\end{cases}
$$
こうすると、DPテーブルの右下の値が、最終的な「すぬけくんの点数 $-$ すめけくんの点数」となる。
よって、これに $a$ も $b$ も含めた全ての価値の合計を加えて $2$ で割ると答えになる。
また、一次元データでインライン(というかインプレース)で更新してもよい。
計算量は $O(AB)$。
入力例2での動作
入力を受け取る。
以下では、左の山の長さを n、右の山の長さを m とする。
n: 5
m: 5
a: {2, 4, 5, 4, 2}
b: {2, 8, 3, 4, 5}
dp[i][j] を、A が $i$ 個、B が $j$ 個残っている状態の値とする。
値は「現在の手番の人の得点 $-$ 相手の得点」の最大値とする。
DP テーブルは次のようになる。
| A の残り個数\B の残り個数 | $0$ | $1$ | $2$ | $3$ | $4$ | $5$ |
|---|---|---|---|---|---|---|
| $0$ | 0 | 5 | -1 | 4 | 4 | -2 |
| $1$ | 2 | 3 | 3 | 0 | 8 | 4 |
| $2$ | 2 | 3 | 1 | 4 | 4 | 0 |
| $3$ | 3 | 2 | 4 | 1 | 7 | 5 |
| $4$ | 1 | 4 | 0 | 3 | 5 | -1 |
| $5$ | 1 | 4 | 2 | 1 | 7 | 3 |
例えば dp[1][1] では、a から取る場合と b から取る場合を比較する。
aから取る: 2 - 5 = -3
bから取る: 5 - 2 = 3
よって dp[1][1] = 3 となる。
最終的に、すぬけ君の得点 $-$ すめけ君の得点は dp[5][5] = 3 である。
全ての価値の合計は $17+22=39$ なので、答えは $(3+39)/2=21$。
注意点
特になし。
別解
特になし。