2169번 로봇 조종하기 G2
문제
NASA에서는 화성 탐사를 위해 화성에 무선 조종 로봇을 보냈다. 실제 화성의 모습은 굉장히 복잡하지만, 로봇의 메모리가 얼마 안 되기 때문에 지형을 N×M 배열로 단순화하여 생각하기로 한다. 지형의 고저차의 특성상, 로봇은 움직일 때 배열에서 왼쪽, 오른쪽, 아래쪽으로 이동할 수 있지만, 위쪽으로는 이동할 수 없다. 또한 한 번 탐사한 지역(배열에서 하나의 칸)은 탐사하지 않기로 한다. 각각의 지역은 탐사 가치가 있는데, 로봇을 배열의 왼쪽 위 (1, 1)에서 출발시켜 오른쪽 아래 (N, M)으로 보내려고 한다. 이때, 위의 조건을 만족하면서, 탐사한 지역들의 가치의 합이 최대가 되도록 하는 프로그램을 작성하시오.
입력
첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다.
출력
첫째 줄에 최대 가치의 합을 출력한다.
다이나믹 프로그래밍을 통해 문제를 해결했다.
로봇이 왼쪽, 오른쪽, 위에서 온 경우 총 3가지 방향에 따라 처리를 진행했다.
끝 지점에 대한 예외가 존재해서 해당 부분만 예외 처리를 진행했다.
해당 방법으로 구한 점화식은 다음과 같다.
dp [y][x][LEFT] = max(dp [y][x-1][DOWN], dp [y][x-1][LEFT]) + floor [x]
dp [y][x][RIGHT] = max(dp [y][x+1][DOWN], dp [y][x+1][RIGHT]) + floor [x]
dp [y][x][DOWN] = max(dp [y-1][x]) + floor [x]
더보기
import sys
col, row = map(int, sys.stdin.readline().split())
dp = []
for _ in range(2):
q = []
for _ in range(row):
q.append([-10000000, -10000000, -10000000])
dp.append(q)
DOWN, LEFT, RIGHT = 0, 1, 2
floor = list(map(int, sys.stdin.readline().split()))
dp[0][0][DOWN] = floor[0]
for x in range(1, row):
dp[0][x][LEFT] = max(dp[0][x-1][DOWN], dp[0][x-1][LEFT]) + floor[x]
y = 0
for t in range(1, col):
y = t%2
floor = list(map(int, sys.stdin.readline().split()))
for x in range(row):
dp[y][x][DOWN] = max(dp[y-1][x]) + floor[x]
for x in range(1, row):
dp[y][x][LEFT] = max(dp[y][x-1][DOWN], dp[y][x-1][LEFT]) + floor[x]
for x in range(row-2,-1,-1):
dp[y][x][RIGHT] = max(dp[y][x+1][DOWN], dp[y][x+1][RIGHT]) + floor[x]
print(max(dp[y][-1]))
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[구두 수선공/G1/Python3] (0) | 2024.11.23 |
---|---|
[공항/G2/Python3/C++] (1) | 2024.11.22 |
[서강그라운드/G4/Python3] (0) | 2024.11.19 |
[보석 도둑/G2/Python3/C++] (0) | 2024.11.18 |
[좀비 바이러스/G3/Python3] (0) | 2024.11.17 |