백준 2169번 로봇 조종하기 G2
문제
NASA에서는 화성 탐사를 위해 화성에 무선 조종 로봇을 보냈다. 실제 화성의 모습은 굉장히 복잡하지만, 로봇의 메모리가 얼마 안 되기 때문에 지형을 N×M 배열로 단순화하여 생각하기로 한다. 지형의 고저차의 특성상, 로봇은 움직일 때 배열에서 왼쪽, 오른쪽, 아래쪽으로 이동할 수 있지만, 위쪽으로는 이동할 수 없다. 또한 한 번 탐사한 지역(배열에서 하나의 칸)은 탐사하지 않기로 한다. 각각의 지역은 탐사 가치가 있는데, 로봇을 배열의 왼쪽 위 (1, 1)에서 출발시켜 오른쪽 아래 (N, M)으로 보내려고 한다. 이때, 위의 조건을 만족하면서, 탐사한 지역들의 가치의 합이 최대가 되도록 하는 프로그램을 작성하시오.
입력
첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다.
출력
첫째 줄에 최대 가치의 합을 출력한다.
우연히도 예약된 글과 동일한 문제를 제공받았다.
파이썬 및 C++로도 추가 풀이했다.
더보기
더보기
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]))
더보기
더보기
#include <iostream>
#include <algorithm>
using namespace std;
int dp[2][1001][3];
int cost[1001];
void get_cost(int r)
{
for (int i=0; i<r; ++i)
{
int v; cin>>v;
cost[i] = v;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int left = 0, right = 1, down = 2;
int n, m; cin>>n>>m;
get_cost(m);
int cur_i = 0;
for (int i=0; i<2; ++i)
for (int j=0; j<m; ++j)
for (int k=0; k<3; ++k)
dp[i][j][k] = -10000000;
dp[0][0][down] = cost[0];
for (int i=1; i<m; ++i)
dp[0][i][left] = max(dp[0][i-1][down], dp[0][i-1][left]) + cost[i];
for (int i = 1; i<n; ++i)
{
++cur_i;
get_cost(m);
int y = cur_i%2;
int ry = (cur_i-1)%2;
for (int j=0; j<m; ++j)
dp[y][j][down] = max(dp[ry][j][down], max(dp[ry][j][left], dp[ry][j][right])) + cost[j];
for (int j=1; j<m; ++j)
dp[y][j][left] = max(dp[y][j-1][down], dp[y][j-1][left]) + cost[j];
for (int j=m-2; j>-1; --j)
dp[y][j][right] = max(dp[y][j+1][down], dp[y][j+1][right]) + cost[j];
}
cout<<max(dp[(cur_i%2)][m-1][down], dp[(cur_i%2)][m-1][left]);
return 0;
}
'알고리즘 문제 풀이 > 항해99 코테 스터디' 카테고리의 다른 글
[99클럽/파이썬 챌린저/27일차] 지름길 (0) | 2024.11.23 |
---|---|
[99클럽/파이썬 챌린저/26일차] 주사위 고르기 (0) | 2024.11.22 |
[99클럽/파이썬 챌린저/24일차] 저울 (0) | 2024.11.20 |
[99클럽/파이썬 챌린저/23일차] 치킨 배달 (0) | 2024.11.19 |
[99클럽/파이썬 챌린저/22일차] 산 모양 타일링 (0) | 2024.11.18 |