DHistory

[Baekjoon] DP - 11048 이동하기 본문

Computer Science/Algorithm

[Baekjoon] DP - 11048 이동하기

ddu0422 2024. 8. 20. 22:59

문제

https://www.acmicpc.net/problem/11048

 

풀이

큰 문제를 작은 문제로 나누어 풀 수 있는 DP 문제이다.

 

D[N][M]: (N, M) 위치에 있을 때, 사탕을 최대한 많이 가져올 수 있는 개수

 

1. 첫 블럭 예외 (첫 블럭이 곧 사탕 최대 개수)

2. i 열이 0인 경우 첫 블럭부터 계속 쌓아온 사탕 개수

3. j 열이 0인 경우 첫 블럭부터 계속 쌓아온 사탕 개수

4. 대각선인 경우 아래 경우의 수 중 가장 큰 사탕 개수

  4-1) 위에서 온 경우

  4-2) 왼쪽에서 온 경우

  4-3) 대각선에서 온 경우

예시

3 x 4

사탕 수

1 2 3 4
0 0 0 5
9 8 7 6

 

최대 개수

1 3 6 10
1 3 6 15
10 18 25 31

 

코드

import sys

n, m = map(int, sys.stdin.readline().rstrip().split())
d = [[0] * m for _ in range(n)]
a = []
for _ in range(n):
    a.append(list(map(int, sys.stdin.readline().rstrip().split())))

for i in range(n):
    for j in range(m):
        if i == 0 and j == 0:
            d[i][j] = a[i][j]
            continue

        if i == 0:
            d[i][j] = d[i][j - 1] + a[i][j]
            continue

        if j == 0:
            d[i][j] = d[i - 1][j] + a[i][j]
            continue

        d[i][j] = max(d[i][j - 1], d[i - 1][j], d[i - 1][j - 1]) + a[i][j]

print(d[n - 1][m - 1])