Blitz Round #25 B - Jump Trip Score
長さ の整数列 があり、位置 から出発して に着いたら終わりです。スコアは から始まり、各位置で次のどちらかを行います。
- をスコアに足して に進む
- 正の整数 () を選んで に跳ぶ(スコアは変わらない)
跳ぶ操作は高々 1 回まで使えるとき、最終スコアの最大値を求める問題です。
- 、、テストケースの の総和は 以下
正確な問題文は元の問題ページを見てください。
から に跳ぶと、 を飛ばすことになります。跳ぶのは高々 1 回なので、得られるスコアは
で、間の 1 区間を飛ばした形になります(跳ばなければ全部の和)。
そこで
- = 長さ 以下の接頭辞の和の最大値(空も含むので 以上)
- = 位置 以降から始まる接尾辞の和の最大値(空も含む)
を累積和で求めておけば、答えは
です。接頭辞と接尾辞が重ならないように、境目 を全通り試しています。計算量は です。
Python
for _ in range(int(input())): N = int(input()) A = list(map(int,input().split())) dp0 = [0] x = 0 for a in A: x += a dp0.append(max(x, dp0[-1])) dp1 = [0] x = 0 for a in reversed(A): x += a dp1.append(max(x, dp1[-1])) dp1.reverse() print(max(x+y for x,y in zip(dp0,dp1)))dp0 が 、dp1 が にあたります。