다이나믹 프로그래밍 문제1 in python

금광문제


문제

  • n X m 크기의 금광이 있다. 금광은 1 X1 의크기를 가지고 각 칸에 특정한 크기의 금이 들어있습니다.
  • 채굴자는 첫번째 열부터 금을 캔다. 맨처음에는 첫번째 열의 어느 행에서든 출발할 수 있습니다. 이후 m-1번에 걸쳐 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동, 이때 얻을 수 있는 금의 최대값은?


수기코드



코드

# 테스트 케이스(Test Case) 입력
for tc in range(int(input())):
    n, m = map(int, input().split()) # 3*4 행렬
    array = list(map(int, input().split())) #1 3 3 2 2 1 4 1 0 6 4 7


    # 3*4 행렬 만들기
    dp = []
    index = 0
    for i in range(n):
        dp.append(array[index:index + m])
        index += m
    print("dp : ", dp)
    
    # 다이나믹 프로그래밍 진행
    for j in range(1, m):
        for i in range(n):
            # 왼쪽 위에서 오는 경우
            if i == 0:
                left_up = 0
            else:
                left_up = dp[i - 1][j - 1]
            print("left_up : ",left_up)
            # 왼쪽 아래에서 오는 경우
            if i == n - 1:
                left_down = 0
            else:
                left_down = dp[i + 1][j - 1]
            print("left_down : ", left_down)
        
            # 왼쪽에서 오는 경우
            left = dp[i][j - 1]
            dp[i][j] = dp[i][j] + max(left_up, left_down, left)
            
            print("left : ", left)
            print("new_dp : ", dp)
    
    result = 0
    for i in range(n):
        result = max(result, dp[i][m - 1])

    print("answer : ", result)



출처

이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저)

좋은 웹페이지 즐겨찾기