|
| 1 | +from sys import stdin |
| 2 | + |
| 3 | + |
| 4 | +def compute_sum(location): |
| 5 | + global triang_list |
| 6 | + global memo |
| 7 | + |
| 8 | + line, number = location |
| 9 | + |
| 10 | + if line == len(triang_list) - 1: |
| 11 | + if location in memo: |
| 12 | + return memo[location] |
| 13 | + return_val = triang_list[line][number] |
| 14 | + memo[location] = return_val |
| 15 | + # print(f'return: {return_val}') |
| 16 | + return return_val |
| 17 | + |
| 18 | + if number == len(triang_list[line]): |
| 19 | + if (line + 1, number) in memo: |
| 20 | + return triang_list[line][number] + memo[(line + 1, number)] |
| 21 | + return_val = compute_sum((line + 1, number)) |
| 22 | + memo[line + 1, number] = return_val |
| 23 | + # print(f'return: {return_val}') |
| 24 | + return triang_list[line][number] + return_val |
| 25 | + |
| 26 | + if (line + 1, number) in memo: |
| 27 | + left_sum = memo[(line + 1, number)] |
| 28 | + else: |
| 29 | + left_sum = compute_sum((line + 1, number)) |
| 30 | + memo[(line + 1, number)] = left_sum |
| 31 | + if (line + 1, number + 1) in memo: |
| 32 | + right_sum = memo[(line + 1, number + 1)] |
| 33 | + else: |
| 34 | + right_sum = compute_sum((line + 1, number + 1)) |
| 35 | + memo[(line + 1, number + 1)] = right_sum |
| 36 | + return_val = triang_list[line][number] + max(left_sum, right_sum) |
| 37 | + # print(f'return: {return_val}') |
| 38 | + return return_val |
| 39 | + |
| 40 | + |
| 41 | +def sol(): |
| 42 | + C = int(stdin.readline()) |
| 43 | + for _ in range(C): |
| 44 | + n = int(stdin.readline()) |
| 45 | + global triang_list |
| 46 | + global memo |
| 47 | + triang_list = [] |
| 48 | + memo = {} |
| 49 | + for __ in range(n): |
| 50 | + triang_list.append(list(map(int, stdin.readline().split()))) |
| 51 | + print(compute_sum((0, 0))) |
| 52 | + # print(memo) |
| 53 | + |
| 54 | + |
| 55 | +sol() |
0 commit comments