標記の件、参加者様の書かれたコードを読んでいて不明点があったのでご質問します。
問題は、K-Stonesです。
https://atcoder.jp/contests/dp/tasks/dp_k
問題の引用
N 個の正整数からなる集合A={a1,a2,…,aN} があります。
太郎君と次郎君が次のゲームで勝負します。
最初に、K 個の石からなる山を用意します。 二人は次の操作を交互に行います。 先手は太郎君です。
A の元 x をひとつ選び、山からちょうどx個の石を取り去る。
先に操作を行えなくなった人が負けです。
二人が最適に行動すると仮定したとき、どちらが勝つかを判定してください。
解答コードの引用
python
1n,k,*A=map(int,open(0).read().split()) 2dp=[0]*k*2 3for i in range(k): 4 if dp[i]<1: 5 for a in A: dp[i+a]=1 6print(['Second','First'][dp[k]])
ある程度の長さ(kの2倍)をもつdpを用意して、そこに勝ちのパターン、1なら先攻勝ち、0なら後攻勝ち、を入れて行って、最後にdpのk番目はどちらかを出力しているように見えます。
石の取り方の選択肢をfor a in Aで全パターン検討して、i番目にaを足したところは1(先攻勝ち)になる、という処理でdpが作られていますが、なぜこの処理で勝ちのパターンが生成できるのでしょうか。
ご教示お願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。