def maxGameScore(cell):
n = len(cell)
if n == 0:
return 12
if n == 1:
return cell[0]
# Step 1: Precompute primes up to n using Sieve of Eratosthenes
is_prime = [True] * n
p = 2
while p * p < n:
if is_prime[p]:
for i in range(p * p, n, p):
is_prime[i] = False
p += 1
# Filter for primes ending in 3
valid_primes = [p for p in range(2, n) if is_prime[p] and p % 10 == 3]
# Step 2: Initialize DP array
# Use negative infinity for unreachable states
dp = [float('-inf')] * n
dp[0] = 0 # Starting point score is 0 before adding the cell[0] value (which is also 0)
# Step 3: Populate the DP array
for i in range(1, n):
# Option 1: 1-step jump from the previous cell
if dp[i - 1] != float('-inf'):
dp[i] = dp[i - 1]
# Option 2: Jump from i-p where p is a valid prime
for p in valid_primes:
if p > i:
break # Primes are sorted, so we can stop if p is larger than current index i
if dp[i - p] != float('-inf'):
if dp[i - p] > dp[i]:
dp[i] = dp[i - p]
# Add the current cell's value to the maximum previous state found
if dp[i] != float('-inf'):
dp[i] += cell[i]
return dp[-1]
print(maxGameScore([0, -10, -20, -30, 50]))
ZGVmIG1heEdhbWVTY29yZShjZWxsKToKICAgIG4gPSBsZW4oY2VsbCkKICAgIGlmIG4gPT0gMDoKICAgICAgICByZXR1cm4gMTIKICAgIGlmIG4gPT0gMToKICAgICAgICByZXR1cm4gY2VsbFswXQoKICAgICMgU3RlcCAxOiBQcmVjb21wdXRlIHByaW1lcyB1cCB0byBuIHVzaW5nIFNpZXZlIG9mIEVyYXRvc3RoZW5lcwogICAgaXNfcHJpbWUgPSBbVHJ1ZV0gKiBuCiAgICBwID0gMgogICAgd2hpbGUgcCAqIHAgPCBuOgogICAgICAgIGlmIGlzX3ByaW1lW3BdOgogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShwICogcCwgbiwgcCk6CiAgICAgICAgICAgICAgICBpc19wcmltZVtpXSA9IEZhbHNlCiAgICAgICAgcCArPSAxCiAgICAgICAgCiAgICAjIEZpbHRlciBmb3IgcHJpbWVzIGVuZGluZyBpbiAzCiAgICB2YWxpZF9wcmltZXMgPSBbcCBmb3IgcCBpbiByYW5nZSgyLCBuKSBpZiBpc19wcmltZVtwXSBhbmQgcCAlIDEwID09IDNdCgogICAgIyBTdGVwIDI6IEluaXRpYWxpemUgRFAgYXJyYXkKICAgICMgVXNlIG5lZ2F0aXZlIGluZmluaXR5IGZvciB1bnJlYWNoYWJsZSBzdGF0ZXMKICAgIGRwID0gW2Zsb2F0KCctaW5mJyldICogbgogICAgZHBbMF0gPSAwICAjIFN0YXJ0aW5nIHBvaW50IHNjb3JlIGlzIDAgYmVmb3JlIGFkZGluZyB0aGUgY2VsbFswXSB2YWx1ZSAod2hpY2ggaXMgYWxzbyAwKQoKICAgICMgU3RlcCAzOiBQb3B1bGF0ZSB0aGUgRFAgYXJyYXkKICAgIGZvciBpIGluIHJhbmdlKDEsIG4pOgogICAgICAgICMgT3B0aW9uIDE6IDEtc3RlcCBqdW1wIGZyb20gdGhlIHByZXZpb3VzIGNlbGwKICAgICAgICBpZiBkcFtpIC0gMV0gIT0gZmxvYXQoJy1pbmYnKToKICAgICAgICAgICAgZHBbaV0gPSBkcFtpIC0gMV0KICAgICAgICAgICAgCiAgICAgICAgIyBPcHRpb24gMjogSnVtcCBmcm9tIGktcCB3aGVyZSBwIGlzIGEgdmFsaWQgcHJpbWUKICAgICAgICBmb3IgcCBpbiB2YWxpZF9wcmltZXM6CiAgICAgICAgICAgIGlmIHAgPiBpOgogICAgICAgICAgICAgICAgYnJlYWsgICMgUHJpbWVzIGFyZSBzb3J0ZWQsIHNvIHdlIGNhbiBzdG9wIGlmIHAgaXMgbGFyZ2VyIHRoYW4gY3VycmVudCBpbmRleCBpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBkcFtpIC0gcF0gIT0gZmxvYXQoJy1pbmYnKToKICAgICAgICAgICAgICAgIGlmIGRwW2kgLSBwXSA+IGRwW2ldOgogICAgICAgICAgICAgICAgICAgIGRwW2ldID0gZHBbaSAtIHBdCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBBZGQgdGhlIGN1cnJlbnQgY2VsbCdzIHZhbHVlIHRvIHRoZSBtYXhpbXVtIHByZXZpb3VzIHN0YXRlIGZvdW5kCiAgICAgICAgaWYgZHBbaV0gIT0gZmxvYXQoJy1pbmYnKToKICAgICAgICAgICAgZHBbaV0gKz0gY2VsbFtpXQoKICAgIHJldHVybiBkcFstMV0KICAgIApwcmludChtYXhHYW1lU2NvcmUoWzAsIC0xMCwgLTIwLCAtMzAsIDUwXSkp