input
2차원 int 배열 triangles

1 ≤ triangles.len ≤ 500
output
상향식 접근
triangles[i][j] + max(dp[j], dp[j+1])dp[0] 리턴def solution(triangle):
# triangle의 마지막 요소 복사
dp = triangle[-1][:]
# 아래에서 2 번째 행부터 역순으로 loop
# i == 행의 요소 개수
for i in range(len(triangle) - 2, -1, -1):
# i행 아래까지 진행된 dp 배열의 값을 참고
for j in range(i+1):
dp[j] = triangle[i][j] + max(dp[j], dp[j+1])
return dp[0]
하향식 접근
triangle.len만큼 복사하니깐, O(N) 공간 복잡도를 가짐def solution(triangle):
h = len(triangle)
dp = [row[:] for row in triangle]
# 두 번째 행부터 시작
for i in range(1, h):
for j in range(i+1):
# 좌측 라인
if j == 0:
dp[i][j] += dp[i-1][j]
# 우측 라인
elif j == i:
dp[i][j] += dp[i-1][j-1]
else:
dp[i][j] += max(dp[i-1][j-1], dp[i-1][j])
return max(dp[-1])