質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

918閲覧

atcoderにおけるedpcの問題Kについて

konishi201102

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/11/09 11:16

標記の件、参加者様の書かれたコードを読んでいて不明点があったのでご質問します。

問題は、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が作られていますが、なぜこの処理で勝ちのパターンが生成できるのでしょうか。

ご教示お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

動的計画法(DP)を使うアルゴリズムです。

K – Stones 解説 (Educational DP Contest / DP まとめコンテスト)をお読みください。

投稿2021/11/09 14:55

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問