def parse(s: str) -> list[list[int]]: return [[int(i) for i in l.split()] for l in s.strip().splitlines()] def solve(l: list[list[int]]) -> int: cache = {} n = len(l) l = reversed(l) for i, row in enumerate(l): for j, val in enumerate(row): if i == 0: cache.update({(i, j): val}) else: l = cache[(i-1, j)] r = cache[(i-1, j+1)] cache.update({(i, j): val+max(l, r)}) return cache[(n-1, 0)] if __name__ == '__main__': with open("input", "r") as f: input = f.read() print(solve(parse(input)))