[DP] Q31 금광

Minsang Kang·2023년 4월 14일
0

CodingTest

목록 보기
31/35

난이도: 1.5 / 풀이 시간: 30분

n x m 크기의 금광이 있습니다. 금광은 1 x 1 크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있습니다.
채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작합니다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있습니다.
이후에 m번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른 쪽 아래 3가지 중 하나의 위치로 이동해야 합니다.
결과적으로 채굴자가 얻을 수 있는 금의 최대 크 기를 출력하는 프로그램을 작성하세요.

만약 다음과 같이 3 x 4 크기의 금광이 존재한다고 가정합시다.

1 3 3 2
2 1 4 1
0 6 4 7

가장 왼쪽 위의 위치를 (1, 1), 가장 오른쪽 아래의 위치를 (n, m)이라고 할 때, 위 예시에서는 (2, 1) -> (3,2) -> (3, 3) -> (3, 4)의 위치로 이동하면 총 19만큼의 금을 채굴할 수 있으며, 이때의 값이 최댓값입니다.

입력조건

  • 첫째 줄에 테스트 케이스 T가 입력됩니다. (1 ≤ T ≤ 1000)
  • 매 테스트 케이스 첫째 줄에 n과 m이 공백으로 구분되어 입력됩니다. (1 ≤ n, m ≤ 20)
  • 둘째 줄에 n X m개의 위치에 매장된 금의 개수가 공백으로 구분되어 입력됩니다. (1 ≤ 각 위치에 매장된 금의 개수 ≤ 100)

출력 조건

  • 테스트 케이스마다 채굴자가 얻을 수 있는 금의 최대 크기를 출력합니다. 각 테스트 케이스는 줄 바꿈을 이용해 구분합니다.

입력 예시

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

출력 예시

19
16


풀이 특징

  • dp[i][j] 값은 max(dp[i-1][j-1] + graph[i][j], dp[i][j-1] + graph[i][j], dp[i+1][j-1] + graph[i][j]) 값
  • 좌상단, 좌, 좌하단에서 온 값들 중 max 값
import sys
import copy
input = sys.stdin.readline

t = int(input())
for _ in range(t):
    n, m = map(int, input().split())
    array = list(map(int, input().split()))

    index = 0
    graph = []
    for i in range(n):
        graph.append(array[index:index+m])
        index += m

    # DP 시작
    dp = copy.deepcopy(graph)
    maxValue = 0
    for j in range(1, m):
        for i in range(n):
            dp[i][j] = max(dp[i][j], dp[i][j-1] + graph[i][j])
            if i-1 >= 0:
                dp[i][j] = max(dp[i][j], dp[i-1][j-1] + graph[i][j])
            if i+1 < n:
                dp[i][j] = max(dp[i][j], dp[i+1][j-1] + graph[i][j])
            maxValue = max(maxValue, dp[i][j])

    for i in range(n):
        for j in range(m):
            print(dp[i][j], end=" ")
        print()
    print()

    print(maxValue)
profile
 iOS Developer

0개의 댓글