위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
30
memo = {}
def f(n):
if n in memo:
return memo[n]
else:
output = []
ex = f(n-1)
if len(ex) < 2:
output.append(ex[0] + tri_numbers[n-1][0])
output.append(ex[0] + tri_numbers[n-1][1])
else:
output.append(ex[0] + tri_numbers[n-1][0])
k = 0
for i in tri_numbers[n-1][1:-1]:
tmp = []
for j in ex[0+k:2+k]:
tmp.append(i + j)
output.append(max(tmp[0], tmp[1]))
k += 1
output.append(ex[-1] + tri_numbers[n-1][-1])
memo[n] = output
return output
num = int(input(''))
tri_numbers = []
for i in range(num):
i = [int(x) for x in input('').split()]
tri_numbers.append(i)
memo[1] = tri_numbers[0]
print(max(f(num)))