티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/2169

 

2169번: 로봇 조종하기

첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다.

www.acmicpc.net

 

풀이

일반적인 DP이지만 방향을 잘 잡아주어야 합니다.

저 같은 경우 어느 방향에서 왔는지에 대한 정보를 함께 넘겨주어, 그 방향으로는 다시 전개를 안 하게끔 구현했습니다. (line 20)

 

 

정답 코드

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
using namespace std;

int n, m, p[1111][1111];
int dx[] = {0, 1, 0}, dy[] = {1, 0, -1};
int d[1111][1111][3];

bool isValid(int x, int y) {
    return 0 <= x && x < n && 0 <= y && y < m;
}

int go(int x, int y, int prevDir) {
    if (x == n - 1 && y == m - 1) return p[x][y];
    int &ret = d[x][y][prevDir];
    if (ret != -1) return ret;
    ret = -INF;
    for (int k = 0; k < 3; k++) {
        if ((prevDir + 2) % 4 == k) continue;
        int nx = x + dx[k], ny = y + dy[k];
        if (!isValid(nx, ny)) continue;

        ret = max(ret, p[x][y] + go(nx, ny, k));
    }
    return ret;
}

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

    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> p[i][j];
        }
    }
    memset(d, -1, sizeof(d));
    cout << go(0, 0, 1);
}
728x90

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[BOJ] 백준 13544 - 수열과 쿼리 3  (0) 2021.03.30
[BOJ] 백준 2616 - 소형기관차  (0) 2021.03.30
[BOJ] 백준 2281 - 데스노트  (1) 2021.03.30
[BOJ] 백준 2306 - 유전자  (0) 2021.03.30
[BOJ] 백준 12886 - 돌 그룹  (0) 2021.03.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함