def maxGameScore(cell):
n = len(cell)
if n == 0:
return 0
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]))
ZGVmIG1heEdhbWVTY29yZShjZWxsKToKICAgIG4gPSBsZW4oY2VsbCkKICAgIGlmIG4gPT0gMDoKICAgICAgICByZXR1cm4gMAogICAgaWYgbiA9PSAxOgogICAgICAgIHJldHVybiBjZWxsWzBdCgogICAgIyBTdGVwIDE6IFByZWNvbXB1dGUgcHJpbWVzIHVwIHRvIG4gdXNpbmcgU2lldmUgb2YgRXJhdG9zdGhlbmVzCiAgICBpc19wcmltZSA9IFtUcnVlXSAqIG4KICAgIHAgPSAyCiAgICB3aGlsZSBwICogcCA8IG46CiAgICAgICAgaWYgaXNfcHJpbWVbcF06CiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHAgKiBwLCBuLCBwKToKICAgICAgICAgICAgICAgIGlzX3ByaW1lW2ldID0gRmFsc2UKICAgICAgICBwICs9IDEKICAgICAgICAKICAgICMgRmlsdGVyIGZvciBwcmltZXMgZW5kaW5nIGluIDMKICAgIHZhbGlkX3ByaW1lcyA9IFtwIGZvciBwIGluIHJhbmdlKDIsIG4pIGlmIGlzX3ByaW1lW3BdIGFuZCBwICUgMTAgPT0gM10KCiAgICAjIFN0ZXAgMjogSW5pdGlhbGl6ZSBEUCBhcnJheQogICAgIyBVc2UgbmVnYXRpdmUgaW5maW5pdHkgZm9yIHVucmVhY2hhYmxlIHN0YXRlcwogICAgZHAgPSBbZmxvYXQoJy1pbmYnKV0gKiBuCiAgICBkcFswXSA9IDAgICMgU3RhcnRpbmcgcG9pbnQgc2NvcmUgaXMgMCBiZWZvcmUgYWRkaW5nIHRoZSBjZWxsWzBdIHZhbHVlICh3aGljaCBpcyBhbHNvIDApCgogICAgIyBTdGVwIDM6IFBvcHVsYXRlIHRoZSBEUCBhcnJheQogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbik6CiAgICAgICAgIyBPcHRpb24gMTogMS1zdGVwIGp1bXAgZnJvbSB0aGUgcHJldmlvdXMgY2VsbAogICAgICAgIGlmIGRwW2kgLSAxXSAhPSBmbG9hdCgnLWluZicpOgogICAgICAgICAgICBkcFtpXSA9IGRwW2kgLSAxXQogICAgICAgICAgICAKICAgICAgICAjIE9wdGlvbiAyOiBKdW1wIGZyb20gaS1wIHdoZXJlIHAgaXMgYSB2YWxpZCBwcmltZQogICAgICAgIGZvciBwIGluIHZhbGlkX3ByaW1lczoKICAgICAgICAgICAgaWYgcCA+IGk6CiAgICAgICAgICAgICAgICBicmVhayAgIyBQcmltZXMgYXJlIHNvcnRlZCwgc28gd2UgY2FuIHN0b3AgaWYgcCBpcyBsYXJnZXIgdGhhbiBjdXJyZW50IGluZGV4IGkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIGRwW2kgLSBwXSAhPSBmbG9hdCgnLWluZicpOgogICAgICAgICAgICAgICAgaWYgZHBbaSAtIHBdID4gZHBbaV06CiAgICAgICAgICAgICAgICAgICAgZHBbaV0gPSBkcFtpIC0gcF0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAjIEFkZCB0aGUgY3VycmVudCBjZWxsJ3MgdmFsdWUgdG8gdGhlIG1heGltdW0gcHJldmlvdXMgc3RhdGUgZm91bmQKICAgICAgICBpZiBkcFtpXSAhPSBmbG9hdCgnLWluZicpOgogICAgICAgICAgICBkcFtpXSArPSBjZWxsW2ldCgogICAgcmV0dXJuIGRwWy0xXQogICAgCnByaW50KG1heEdhbWVTY29yZShbMCwgLTEwLCAtMjAsIC0zMCwgNTBdKSk=