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

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

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

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

Q&A

1回答

900閲覧

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

konishi201102

総合スコア19

Python 3.x

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

0グッド

0クリップ

投稿2021/11/09 10:57

編集2021/11/09 10:58

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

問題は、L-Dequeです。
https://atcoder.jp/contests/dp/tasks/dp_l

問題の引用

最初に、数列a=(a1​,a2​,…,aN​) が与えられます。
a が空になるまで、二人は次の操作を交互に行います。 先手は太郎君です。
a の先頭要素または末尾要素を取り除く。 取り除いた要素を x とすると、操作を行った人はx 点を得る。
ゲーム終了時の太郎君の総得点をX、次郎君の総得点を Y とします。 太郎君は X−Y を最大化しようとし、次郎君はX−Y を最小化しようとします。
二人が最適に行動すると仮定したとき、X−Y を求めてください。

解答コードの引用

python

1import numpy as np 2 3n = int(input()) 4a = np.array([int(i) for i in input().split()], dtype=np.int64) 5 6s = np.copy(a) 7for i in range(1, n): 8s = np.maximum(a[:n-i]-s[1:n-i+1], a[i:]-s[:n-i]) 9 10print(s[0])

処理の核の部分としては、np.maximumで与えられた配列を一つずつずらして引き算→大きい方(負数でない方?)を選択する部分なんだと思いますが、なぜこうすると最適な解が出るのかがわかりません。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

その参考にしている解答コードはエッセンスを圧縮して書いてあるので、
いきなり理解するのは難しいと思います。

入力例1(N = 4, A = [10, 80, 90, 30])の場合で、
数列のl番目からr番目(l <= r)までが使える場合のX-Yを2次元の
dp表にして作っていくと分かりやすいのではないかと思います。

最初に l=r=0, l=r=1, l=r=2, ... のように数列の中の数字1つだけを使える場合を考えると
表は以下のようになると思います。(未は未計算)

[10, '未', '未', '未'] ['未', 80, '未', '未'] ['未', '未', 90, '未'] ['未', '未', '未', 30]

次に (l=0, r=1), (l=1, r=2), ...のように数字が2つ使用できる場合を考えて
dp表を更新すると以下のようになります。

[10, 70, '未', '未'] ['未', 80, 10, '未'] ['未', '未', 90, 60] ['未', '未', '未', 30]

使える数字を増やしながら表を更新していくと、最終的には以下のようになり、
数列の数字全てを使用した場合のX-Yは10という答えが出てきます。

[10, 70, 20, 10] ['未', 80, 10, 20] ['未', '未', 90, 60] ['未', '未', '未', 30]

質問に貼ってもらった解答コードをステップ実行してsの内容を見ていくと、
以下のようになっていることが分かります。

[10, 80, 90, 30] [70, 10, 60] [20, 20] [10]

これは、上で計算したdp表の左上から右下への斜めの部分の数字の並びと同じになっています。
質問にある解答コードは、numpyの機能をうまく使うことで、わざわざ2次元の表をつくらずに
欲しい答えを求めているのだと思います。

投稿2021/11/09 12:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問