Thief of Wealth
Published 2020. 11. 2. 21:24
[BOJ] 11048 이동하기 개발/알고리즘

1. 문제

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

준규는 현재 (1, 1)에 있고, (N, M)으로 이동하려고 한다. 준규가 (r, c)에 있으면, (r+1, c), (r, c+1), (r+1, c+1)로 이동할 수 있고, 각 방을 방문할 때마다 방에 놓여져있는 사탕을 모두 가져갈 수 있다. 또, 미로 밖으로 나갈 수는 없다.

준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수의 최댓값을 구하시오.

2. 입력

첫째 줄에 미로의 크기 N, M이 주어진다. (1 ≤ N, M ≤ 1,000)

둘째 줄부터 N개 줄에는 총 M개의 숫자가 주어지며, r번째 줄의 c번째 수는 (r, c)에 놓여져 있는 사탕의 개수이다. 사탕의 개수는 0보다 크거나 같고, 100보다 작거나 같다.

3. 출력

첫째 줄에 준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수를 출력한다.

 

 

핵심내용

아주 기본적인 다이나믹 프로그래밍의 기초문제이다.

문제에 제시되어 있지는 않지만 마지막 칸에서의 최대 사탕개수를 출력하면 되며,

dp 2차원 배열을 만들어서 3가지 방향에 대해, "dp[i][j]는 i,j에서의 최대값"으로 정의하고 구현하면 된다.

 

<html />
import sys input = sys.stdin.readline n, m = map(int, input().rstrip().split(" ")) board = [[*map(int, input().rstrip().split(" "))] for _ in range(n)] dp = [[0]*m for _ in range(n)] dp[0][0] = board[0][0] for i in range(n): for j in range(m): for a, b in ((1, 0), (0, 1), (1, 1)): new_i = i+a new_j = j+b if(new_i >= 0 and new_j >= 0 and new_i < n and new_j < m): dp[new_i][new_j] = max( dp[new_i][new_j], board[new_i][new_j]+dp[i][j]) print(dp[n-1][m-1])
한번 누르면 2시간동안 보이지 않아요 ㅎㅎ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
원치 않을 경우 를 눌러주세요

'개발 > 알고리즘' 카테고리의 다른 글

[BOJ] 1699 제곱수의 합  (0) 2020.11.06
[BOJ] 1010 다리 놓기  (0) 2020.11.03
[BOJ] 1325 효율적인 해킹 파이썬  (0) 2020.11.01
[BOJ] 1904 01타일  (0) 2020.10.31
[BOJ] 9093 단어뒤집기  (0) 2020.10.30