58 lines
1.3 KiB
Python
58 lines
1.3 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
def search_row(row):
|
||
|
row = [a for a in row]
|
||
|
for i in range(1, len(row)):
|
||
|
prev, val = row[i-1], row[i]
|
||
|
row[i] = max(prev + val, val)
|
||
|
return max(row)
|
||
|
|
||
|
def search_rows(grid):
|
||
|
return max(search_row(row) for row in grid)
|
||
|
|
||
|
def search_diagonals(grid):
|
||
|
ln = len(grid)
|
||
|
m = 0
|
||
|
for d in range(-ln + 1, ln):
|
||
|
r = search_row([grid[i][i+d]
|
||
|
for i in range(ln) if 0 <= i+d < ln])
|
||
|
m = max(m, r)
|
||
|
return m
|
||
|
|
||
|
def fib_gen(k, mem):
|
||
|
if len(mem) > k and mem[k] != None:
|
||
|
return mem[k]
|
||
|
elif k < 56:
|
||
|
s = 100003 - 200003*k + 300007*k**3
|
||
|
s %= 1000000
|
||
|
s -= 500000
|
||
|
else:
|
||
|
s = (fib_gen(k-24, mem) + fib_gen(k-55, mem) + 1000000) % 1000000
|
||
|
s -= 500000
|
||
|
mem += [None] * (k - len(mem) + 1)
|
||
|
mem[k] = s
|
||
|
return s
|
||
|
|
||
|
|
||
|
grid2 = [[-2, 5, 3, 2],
|
||
|
[9, -6, 5, 1],
|
||
|
[3, 2, 7, 3],
|
||
|
[-1, 8, -4, 8]]
|
||
|
|
||
|
mem = []
|
||
|
|
||
|
side = 2000
|
||
|
|
||
|
grid = [[0]*side for i in range(side)]
|
||
|
|
||
|
for ri in range(side):
|
||
|
for ci in range(side):
|
||
|
grid[ri][ci] = fib_gen(side*ri + ci + 1, mem)
|
||
|
|
||
|
rows = search_rows(grid)
|
||
|
cols = search_rows(zip(*grid))
|
||
|
dia1 = search_diagonals(grid)
|
||
|
dia2 = search_diagonals([row[::-1] for row in grid])
|
||
|
|
||
|
print(max(rows, cols, dia1, dia2))
|