알고리즘 문제/DP
[개쉬운 풀이] 백준 2169 로봇 조종하기 CPP (14일차)
odaebum
2024. 12. 5. 16:23
728x90
문제
생각
1. 처음에는 단순하게 BFS로 풀면 된다고 생각했다. 그러나 각 배열에서 들어온 방향에 따라 결과가 달라질 수 있다는 것을 포착했다.
2. 따라서 2중 배열이 아닌 3중 배열을 통해 방향성을 고려하였다.
3. queue를 이용하다 보니 시간초과가 발생하였다. 따라서 이를 dfs와 dp를 활용한 수식으로 바꾸어 주었다.
풀이
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAX = 1001;
const int INF = -1e9;
int N, M;
int map[MAX][MAX];
int dx[3] = {0,0,1}; //좌 우 밑
int dy[3] = {-1,1,0};
bool isVisited[MAX][MAX];
int dp[MAX][MAX][3];
void input(){
cin >> N >> M;
for(int i = 1; i <= N; i++){
for(int j = 1; j <= M; j++){
cin >> map[i][j];
}
}
}
void init(){
for(int i = 1; i < MAX; i++){
for(int j = 1; j < MAX; j++){
for(int k = 0; k < 3; k++){
dp[i][j][k] = INF;
}
}
}
}
int sol(int x, int y, int dir){
if(x == N && y == M) return map[N][M];
if(dp[x][y][dir] != INF) return dp[x][y][dir];
isVisited[x][y] = true;
int tmp = INF;
for(int i = 0; i < 3; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 1 || ny < 1 || nx > N || ny > M || isVisited[nx][ny]) continue;
tmp = max(tmp, sol(nx, ny, i));
}
isVisited[x][y] = false;
dp[x][y][dir] = map[x][y] + tmp;
return dp[x][y][dir];
}
int main(){
input();
init();
cout << sol(1,1,0);
return 0;
}
728x90