접근

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

 

11048번: 이동하기

준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는

www.acmicpc.net

얼핏 dfs나 bfs 문제로 보였지만, 다이나믹 프로그래밍을 이용하여 쉽게 풀 수 있었다.

(r, c) 칸에서 이동할 수 있는 방향은 세방향으로, (r + 1, c), (r, c + 1), (r + 1, c + 1) 이다. 이 점을 반대로 말하면 (r, c) 칸으로 올 수 있는 바로 전 칸은 (r - 1, c), (r, c - 1), (r - 1, c - 1) 이 세 칸이다. 즉 (r, c) 위치에서 최대값을 얻기 위해서는 dp 배열의 (r - 1, c), (r, c - 1), (r - 1, c - 1) 칸 중 가장 큰 값과 (r, c) 칸의 값을 더해야 한다.

코드

N, M = map(int, input().split())
maze = [[0 for _ in range(M + 1)]]
for i in range(N):
    maze.append([0] + list(map(int, input().split())))
dp = [[0] * (M + 1) for _ in range(N + 1)]

for i in range(1, N + 1):
    for j in range(1, M + 1):
        dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + maze[i][j]

print(dp[-1][-1])

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기