본문 바로가기

알고리즘

[Algorithm] 금광 문제

이코테 p.375 '금광' 문제

문제

2차원 테이블에서 채굴자가 얻을 수 있는 금의 최대 크기를 구하는 문제이다.

내 실수

  • 2차원 테이블의 맨 왼쪽부터 채굴자가 얻을 금을 하나씩 선택해서 이어가는 느낌으로 풀었다.
  • 이건 행마다 max 값을 고르는 선택의 느낌으로 풀면 안 된다. (이러면 결국 그리디가 되어버린다)
  • 어떤 선택이 최적해가 될 지 모르기 때문에 결국에는 모든 맵에 대해서 최적해를 구해주어야 한다.
  • 점화식은 나름 비슷하게 세웠는데, 애초에 내 풀이는 가정이 잘못 됐다. ('선택' 의 느낌으로 갔기 때문)

이 문제를 해결하는데 DP 를 선택해야하는 이유

  1. 최적 부분 구조인가 - YES
  2. 중복되는가 - YES

 

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

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

    for j in range(1, m):
        for i in range(n):  # 현재 타겟이 있는 행 인덱스
            # 왼쪽 위에서 오는 경우
            left_up = dp[i - 1][j - 1] if i != 0 else 0
            # 왼쪽 아래서 오는 경우
            left_down = dp[i + 1][j - 1] if i != n - 1 else 0
            # 왼쪽에서 오는 경우
            left = dp[i][j - 1]
            # 가장 큰 값으로 채택
            dp[i][j] = dp[i][j] + max(left_up, left_down, left)

    result = 0
    for i in range(n):
        result = max(result, dp[i][m - 1])

    print(result)

'알고리즘' 카테고리의 다른 글

[Algorithm] min-cost-climbing-stairs 문제  (0) 2022.05.21
[Algorithm] 편집 거리  (0) 2022.05.12
[Algorithm] 1로 만들기  (0) 2022.04.25
[Algorithm] 떡볶이 떡 만들기  (0) 2022.04.16
[Algorithm] 10026. 적록색약  (0) 2022.04.13