Submission #1204825

#TimeUsernameProblemLanguageResultExecution timeMemory
1204825ofozBigger segments (IZhO19_segments)Pypy 3
13 / 100
1596 ms82992 KiB
from collections import deque from sys import setrecursionlimit def solve(): n = int(input()) a = list(map(int, input().split(" "))) a.insert(0, -1) # maintain one-indexed prfx = [] prfx.append(-1) prfx.append(a[1]) for i in range(2, n+1): prfx.append(prfx[-1] + a[i]) def getPrfx(l: int, r: int): left = 0 if not l else prfx[l-1] right = prfx[r] return right - left dp = [[[float('inf'), float('inf')] for _ in range(n+1)] for _ in range(n+1)] dp[0][0] = [0, 0] cur = 0 for i in range(1, n+1): cur += a[i] dp[i][1] = [0, cur] for i in range(1, n+1): for s in range(2, i+1): dp[i][s] = dp[i-1][s].copy() dp[i][s][1] += a[i] for j in range(1, i): cur = getPrfx(j+1, i) if dp[j][s-1][1] <= cur: c = dp[j][s-1].copy() c[0] = c[1] c[1] = cur dp[i][s] = min(dp[i][s], c, key = lambda p: list(reversed(p))) for seg in range(n, 0, -1): if dp[n][seg] != [float('inf'), float('inf')]: print(seg) return print(1) """ let dp[i][seg] denote (mn, cur), where, if we have seg segments up to the i-th point, mn is the minimum sum and cur is the current sum. it follows that they should always be minimal. """ solve()

Compilation message (stdout)

Compiling 'segments.py'...

=======
  adding: __main__.pyc (deflated 44%)

=======
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...