2021.06.12 정수삼각형
Solution
DFS : 삼각형의 꼭대기에서부터 아래 or 오른쪽아래로 깊이우선탐색을 합니다.
DFS로 탐색을 구현할 때 리턴하는 값은 다음과 같이 설정할 수 있습니다.
- 맨 아래인 경우 : 해당 노드의 값
- 맨 아래가 아닌 경우 : 해당 노드의 값 = 그 다음노드부터 맨 아래까지의 최대경로
이렇게 설정하면 결국 재귀로 구현한 깊이우선탐색의 최종 반환 값이 원하는 결과가 됩니다.
DP : 위의 DFS에서 각 노드를 탐색할 때, 이미 탐색한 적이 있는 경우
메모이제이션
을 활용할 수 있습니다.해당 노드부터 맨 아래까지의 경로 중 최댓값을 DP 배열에 저장하고, 이미 탐색한 적이 있는 경우 (DP 배열이 초기값이 아닌경우) 에는 메모이제이션 해둔 값을 반환하도록 합니다.
Source
# DP
# 2021.06.12
def getResult(input_map, memo, y, x, N):
# DP
if memo[y][x] != -1:
return memo[y][x]
# bottom
if y >= N-1:
return input_map[y][x]
# DFS
memo[y][x] = input_map[y][x] + max(getResult(input_map, memo, y+1, x, N), getResult(input_map, memo, y+1, x+1, N))
return memo[y][x]
N = int(input())
my_map = []
memo = [[-1 for _ in range(n)] for n in range(1, N+1)] # max route from this node to bottom
for n in range(N):
my_map.append(list(map(int, input().split())))
print(getResult(my_map, memo, 0, 0, N))
'SW > 알고리즘 문제풀이' 카테고리의 다른 글
백준11404번 플로이드 (0) | 2021.06.20 |
---|---|
백준18353번 병사 배치하기 (0) | 2021.06.16 |
백준14501 퇴사 (0) | 2021.06.12 |
공유기 설치 (0) | 2021.05.19 |
카드정렬하기 (0) | 2021.05.19 |
Comment