728x90
시간 제한 1초, 메모리 제한 256MB
# 조건
- 준규는 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)으로 이동할 때, 가져올 수 있는 사탕 개수의 최댓값을 구하시오.
# 접근 방법
- 딱 보자마자 시간 초과를 안 당하기 위해서는 dp로 접근해야 겠다고 생각하였다.
- 우선 입력받은 arr을 now_val이라는 함수에 첫 행과, 첫 열에 대해서만 누적합을 구해준다.
- 이후, (1, 1)부터 시작하여 now_val을 갱신해나가면 된다.
- 이동할 수 있는 방법은 3가지 이지만, 대각선 이동의 경우 오른쪽 이동과 아래로 이동과 중복되는 값이므로 제외해주고 계산하였다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
now_val = [[0] * M for _ in range(N)]
now_val[0][0] = arr[0][0]
for i in range(1, M):
now_val[0][i] = now_val[0][i-1] + arr[0][i]
for j in range(1, N):
now_val[j][0] = now_val[j-1][0] + arr[j][0]
for i in range(1, N):
for j in range(1, M):
now_val[i][j] = max(now_val[i-1][j], now_val[i][j-1]) + arr[i][j]
print(now_val[N-1][M-1])
728x90
'ALGORITHM > DP(동적 계획법)' 카테고리의 다른 글
[백준 1535번] 파이썬 - 안녕 (0) | 2024.10.30 |
---|---|
[백준 13699번] 파이썬 - 점화식 (0) | 2024.05.29 |
[백준 2670번] 파이썬 - 연속부분최대곱 (0) | 2024.04.04 |
[백준 2193번] 파이썬 - 이친수 (1) | 2024.03.25 |
[백준 17291번] 파이썬 - 새끼치기 (0) | 2024.02.23 |