- 현재 칸 (i, j)까지의 최소 경로 합은 현재 칸의 값(matrix[i][j])에 아래 두 경우 중 작은 값을 더한다
왼쪽 (i-1, j)에서 오는 경우의 값
위쪽 (i, j-1)에서 오는 경우
3. DP테이블 채우기
- 이중 반복문을 통해 DP 테이블을 채워나간다.
- 이 과정을 통해 좌상단에서 우하단까지의 모든 칸에 대한 최소 경로 합을 계산할 수 있다
4. 결과
DP 테이블의 우하단 칸 dp[n-1][n-1]에 저장된 값이 좌상단에서 우하단까지의 최소 경로 합이 된다.
코드 C++
def min_path_sum(matrix):
n = len(matrix)
# 최소 경로 합을 저장할 2차원 DP 테이블 생성
dp = [[0] * n for _ in range(n)]
# DP 테이블 초기화
dp[0][0] = matrix[0][0]
# 첫 번째 행 채우기
for i in range(1, n):
dp[0][i] = dp[0][i-1] + matrix[0][i]
# 첫 번째 열 채우기
for j in range(1, n):
dp[j][0] = dp[j-1][0] + matrix[j][0]
# 나머지 DP 테이블 채우기
for i in range(1, n):
for j in range(1, n):
dp[i][j] = matrix[i][j] + min(dp[i-1][j], dp[i][j-1])
# DP 테이블의 우하단 칸 값이 최소 경로 합
return dp[n-1][n-1]
# 예제 사용
matrix = [
[1, 3, 1],
[1, 5, 1],
[4, 2, 1]
]
print(min_path_sum(matrix)) # 출력: 7
Python
def min_path_sum(matrix):
n = len(matrix)
# 2차원 배열인 dp테이블 생성
dp = [[0] * n for _ in range(n)]
#DP테이블 초기화
dp[0][0] = matrix[0][0]
# 1행은 이전 값으로 채우기
for i in range(1, n):
dp[0][i] = dp[0][i-1] + matrix[0][i]
# 1열은 이전 값으로 채우기
for j in range(1, n):
dp[j][0] = dp[j-1][0] + matrix[j][0]
# 1행과 1열을 제외한 나머지 칸수 채우기
for i in range(1, n):
for j in range(1, n):
dp[i][j] = matrix[i][j] + min(dp[i-1][j], dp[i][j-1])
#오른쪽 가장 아래의 값 출력
return dp[n-1][n-1]
#예시
matrix = [
[1, 3, 1],
[1, 5, 1],
[4, 2, 1]
]
print(min_path_sum(matrix)) # Output: 7