考え方
「$\mathrm{dp}[n] = n$個から開始したときの答え(先手が取れる最大数)」とすると,($A_{1} = 1$よりすべての石を取り尽くすことでゲームが終了するので)後手が取る石の個数は$n - \mathrm{dp}[n]$となる.$n$個ある状態で,はじめに先手が$A_{i}$個とることを確定させると,「先手と後手が入れ替わった,初期値が$n - A_{i}$個の問題」に帰着する.この問題での青木君の答えは$\mathrm{dp}[n - A_{i}]$で,初期状態が$n - A_{i}$の高橋君の答えは$(n - A_{i}) - \mathrm{dp}[n - A_{i}]$となる.
つまり,dpの遷移は
\begin{aligned}
& \mathrm{dp}[n] \\
&= \max_{i} \Bigl\{A_{i} + \bigl[(n - A_{i}) - \mathrm{dp}[n - A_{i}]\bigr] \Bigr\}
\end{aligned}
となる.& \mathrm{dp}[n] \\
&= \max_{i} \Bigl\{A_{i} + \bigl[(n - A_{i}) - \mathrm{dp}[n - A_{i}]\bigr] \Bigr\}
\end{aligned}
回答例
N, K = map(int, input().split()) A = list(map(int, input().split())) dp = [0] * (N + 1) for n in range(1, N + 1): for a in A: if n - a < 0:break dp[n] = max(dp[n], n - dp[n - a]) print(dp[N])