Algorithm (PS)
금광 파이썬 풀이 - Dynamic programming
minjiwoo
2021. 11. 15. 16:55
728x90
금광
이동방향은 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 이다.
이를 현재 내 위치인 dp[i][j]에서 보면 왼쪽 위, 왼쪽, 왼쪽아래에서 내 위치로 오는 3 가지 경우가 있다는 의미이다
하지만 이렇게 i == 0 인 경우에는 왼쪽위에서 올 수 없으므로 left_top = 0 이다. 그렇지 않은 경우에는 left_top = dp[i-1][j-1] 이다.
다음의 경우는 3가지 방향 모두 유효하니까 경우를 더 나눌 필요 없이, left = dp[i][j-1]
i == (n-1) 인 경우에도 왼쪽아래에서 오는 경우는 불가능 하므로 이 경우 left_bottom = 0이라고 처리해 준다.
그렇지 않은 경우는 left_bottom = dp[i+1][j-1] 이다.
그리고 이 값들 중에서 max 값과 dp[i][j]을 더한 값을 dp[i][j] 에 저장한다 !
# pg 375
t = int(input())
for _ in range(t):
n,m = map(int, input())
array = list(map(int, input()))
# 2차원 DP 테이블을 초기화 하는 과정
dp = []
index = 0
for i in range(n):
dp.append(array[index:index+m])
index += m
# DP 진행
for j in range(1, m):
for i in range(n):
# 왼쪽 위에서 오는 경우
if i == 0:
left_top = 0
else:
left_top = dp[i-1][j-1]
# 왼쪽에서 오는 경우
left = dp[i][j-1]
# 왼쪽아래에서 오는 경우
if i == n-1:
left_bottom = 0
else:
left_botton = dp[i+1][j-1]
dp[i][j] = dp[i][j] + max(left_top, left, left_botton)
result = 0
for i in range(n):
result = max(result, dp[i][m-1]) # 맨 마지막 줄 값 비교하기
print(result)
728x90