標記の件、参加者様の書かれたコードを読んでいて不明点があったのでご質問します。
問題は、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で与えられた配列を一つずつずらして引き算→大きい方(負数でない方?)を選択する部分なんだと思いますが、なぜこうすると最適な解が出るのかがわかりません。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。