[Algorithm] BOJ 2169 로봇 조종하기

Juppi·2023년 1월 20일
0
post-custom-banner

문제 링크

https://www.acmicpc.net/problem/2169

문제 풀이

dp와 dfs를 이용해서 구현하였다.

로봇이 오른쪽 아래로 내려가는 과정을 dfs로 풀고,
왼쪽, 위, 대각선 왼쪽 위에서 온 현재 위치의 로봇의 최댓값을 저장해두는 용도로 dp 를 사용하였다.

dp[i][j][k] : (i,j) 위치에 k 방향에서 왔을 때 최댓값

문제 코드

#include <iostream>

using namespace std;

const int MAX = 1000;
const int INF = -987654321;

int n, m, answer;

int map[MAX][MAX];
int dp[MAX][MAX][3];
bool visited[MAX][MAX];

int dx[] = { 0, 0, 1 };
int dy[] = { 1, -1, 0 };

int dfs(int x, int y, int dir) {
    if (x == n-1 && y == m-1)       return map[x][y];
    if (dp[x][y][dir] != INF)       return dp[x][y][dir];

    visited[x][y] = 1;

    int maxVal = INF;
    for (int i=0; i<3; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx >= 0 && ny >= 0 && nx < n && ny < m) {
            if (visited[nx][ny] == 0)
            {
                maxVal = max(maxVal, dfs(nx, ny, i));
            }
        }
    }
    visited[x][y] = 0;
    dp[x][y][dir] = map[x][y] + maxVal;
    return dp[x][y][dir];
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n >> m;

    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            cin >> map[i][j];
        }
    }

    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            dp[i][j][0] = INF;
            dp[i][j][1] = INF;
            dp[i][j][2] = INF;
        }
    }

    answer = dfs(0, 0, 0);
    cout << answer;
    return 0;
}
profile
잠자면서 돈버는 그날까지
post-custom-banner

0개의 댓글