알리바바와 40인의 도둑(Bottom-Up)
알리바바는 40인의 도둑으로부터 금화를 훔쳐 도망치고 있습니다.
알리바바는 도망치는 길에 평소에 잘 가지 않던 계곡의 돌다리로 도망가고자 한다. 계곡의 돌다리는 N×N개의 돌들로 구성되어 있다. 각 돌다리들은 높이가 서로 다릅니다. 해당 돌다리를 건널때 돌의 높이 만큼 에너지가 소비됩니다. 이동은 최단거리 이동을 합니다. 즉 현재 지점에서 오른쪽 또는 아래쪽으로만 이동해야 합니다. N*N의 계곡의 돌다리 격자정보가 주어지면 (1, 1)격자에서 (N, N)까지 가는데 드는 에너지의 최소량을 구하는 프로그램을 작성하세요.
만약 N=3이고, 계곡의 돌다리 격자 정보가 다음과 같다면
(1, 1)좌표에서 (3, 3)좌표까지 가는데 드는 최소 에너지는 3+2+3+4+2=14이다.
▣ 입력설명
첫 번째 줄에는 자연수 N(1<=N<=20)이 주어진다.
두 번째 줄부터 계곡의 N*N 격자의 돌다리 높이(10보다 작은 자연수) 정보가 주어진다.
▣ 출력설명
첫 번째 줄에 (1, 1)출발지에서 (N, N)도착지로 가기 위한 최소 에너지를 출력한다.
▣ 입력예제 1
5
3 7 2 1 9
5 8 3 9 2
5 3 1 2 3
5 4 3 2 1
1 7 5 2 4
▣ 출력예제 1
25
Bottom-Up 방식
Top-Down 방식
메모리 제이션을 쓰지 않는 방법
import sys
sys.stdin = open("zzzz.txt", "r")
def DFS(x, y) :
if x == 0 and y == 0 :
return arr[0][0]
else :
if y == 0 :
return DFS(x-1, y) + arr[x][y]
elif x == 0 :
return DFS(x, y-1) + arr[x][y]
else :
return min(DFS(x-1, y), DFS(x, y-1)) + arr[x][y]
n = int(input())
arr = []
for _ in range(n) :
temp = list(map(int, input().split()))
arr.append(temp)
dy = [[0]*n for _ in range(n)]
print(arr)
print(DFS(n-1, n-1))
DP 사용
- 메모리제이션 사용
import sys
sys.stdin = open("zzzz.txt", "r")
def DFS(x, y) :
if dy[x][y] > 0 :
return dy[x][y]
if x == 0 and y == 0 :
return arr[0][0]
else :
if y == 0 :
dy[x][y] = DFS(x-1, y) + arr[x][y]
elif x == 0 :
dy[x][y] = DFS(x, y-1) + arr[x][y]
else :
dy[x][y] = min(DFS(x-1, y), DFS(x, y-1)) + arr[x][y]
return dy[x][y]
n = int(input())
arr = []
for _ in range(n) :
temp = list(map(int, input().split()))
arr.append(temp)
dy = [[0]*n for _ in range(n)]
print(arr)
print(DFS(n-1, n-1))
'코테풀이 > DP' 카테고리의 다른 글
[백준/인프런 | 골드3] 가장높은탑쌓기(LIS 응용 / 다시풀기) (0) | 2022.06.21 |
---|---|
[백준 | 골드4] 14002번: 가장 긴 증가하는 부분 수열 4 (0) | 2022.04.27 |
[백준 | 실버2] 11053본 가장 긴 증가하는 부분 수열(LIS) (0) | 2022.04.25 |
[프로그래머스 | 3단계] 멀리뛰기 (0) | 2022.04.22 |
[인프런] 계단오르기 (0) | 2022.04.22 |
[인프런 | DP] 알리바바와 40인의 도둑(DP)