提出 #24437899


ソースコード 拡げる

import sys

def main(f):
  N = int(f.readline())
  A = [None] + list(map(int, f.readline().split()))
  S = [0] * (N+1)
  for i in range(1, N+1):
    S[i] = S[i-1] + A[i]

  dp = [[None] * (N+1) for _ in range(N+1)] # dp[i][j] : a_i 〜 a_j を使った場合の答え
  # d = 1
  for i in range(1, N+1):
    dp[i][i] = 0

  for d in range(2, N+1): # 幅dの部分列について計算
    for i in range(1, N+2-d):
      j = i + d - 1
      min_cost = -1
      for k in range(i, j): # 最後に結合する場所で場合分け
        cost = dp[i][k] + dp[k+1][j] + S[j] - S[i-1] # sum(A[i:j+1])
        if min_cost < 0 or cost < min_cost:
          min_cost = cost
      dp[i][j] = min_cost
  print(dp[1][N])

main(sys.stdin)

提出情報

提出日時
問題 N - Slimes
ユーザ enakai
言語 PyPy3 (7.3.0)
得点 100
コード長 752 Byte
結果 AC
実行時間 335 ms
メモリ 76224 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 16
セット名 テストケース
All 0_00, 0_01, 0_02, 0_03, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11
ケース名 結果 実行時間 メモリ
0_00 AC 66 ms 62068 KiB
0_01 AC 52 ms 62016 KiB
0_02 AC 48 ms 62052 KiB
0_03 AC 49 ms 62016 KiB
1_00 AC 49 ms 61680 KiB
1_01 AC 282 ms 76160 KiB
1_02 AC 272 ms 76224 KiB
1_03 AC 227 ms 75792 KiB
1_04 AC 312 ms 76008 KiB
1_05 AC 298 ms 76120 KiB
1_06 AC 308 ms 75916 KiB
1_07 AC 306 ms 75968 KiB
1_08 AC 304 ms 75936 KiB
1_09 AC 335 ms 76168 KiB
1_10 AC 333 ms 75764 KiB
1_11 AC 288 ms 76156 KiB