ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 진우의 달 여행(Large)
    백준알고리즘 2019. 10. 9. 22:35

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

    17485번: 진우의 달 여행 (Large)

    첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2 ≤ N, M ≤ 1000)이 주어진다. 다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다.

    www.acmicpc.net

     

     

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include<iostream>
    #include<queue>
     
    using namespace std;
     
    int n, m;
    int map[1002][1000];
    int dist[1002][1000];
    int d[1002][1000][3];
    int dx[] = { 1,1,1 };
    int dy[] = { 1,0,-1 };
    int ans = 987654321;
     
    void dp() {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < 3; j++) {
                d[0][i][j] = map[0][i];
            }
        }
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (j == 0) {
                    d[i][j][1= d[i - 1][j + 1][0+ map[i][j];
                    d[i][j][2= min(d[i - 1][j][1], d[i - 1][j + 1][0]) + map[i][j];
                }
                else if (j == m - 1) {
                    d[i][j][0= min(d[i - 1][j][1], d[i - 1][j - 1][2]) + map[i][j];
                    d[i][j][1= d[i - 1][j - 1][2+ map[i][j];
                }
                else {
                    d[i][j][0= min(d[i - 1][j - 1][2], d[i - 1][j][1]) + map[i][j];
                    d[i][j][1= min(d[i - 1][j - 1][2], d[i - 1][j + 1][0]) + map[i][j];
                    d[i][j][2= min(d[i - 1][j][1], d[i - 1][j + 1][0]) + map[i][j];
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < 3; j++) {
                if (d[n - 1][i][j] < ans && d[n - 1][i][j] != 0) ans = d[n - 1][i][j];
            }
        }
    }
     
    int main() {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> map[i][j];
            }
        }
        //bfs();
        dp();
     
        cout << ans << '\n';
        return 0;
    }
     
    http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
     

    DP문제, 처음에는 다익스트라비슷한 BFS생각을했는데,

    크기가 1000*1000에서 중복발생이 많다면 분명히 시간초과가 나는것을 예상했다

    BFS는 지양하고, DP점화식을세우는과정에서, 이전에 풀었던 RGB거리가 생각났던문제다.

    점화식 세우는게 어렵지 않은문제 시간을 더줄일수있을진모르겠다.

    '백준알고리즘' 카테고리의 다른 글

    과외맨  (0) 2019.10.10
    N-Queen  (0) 2019.10.09
    거울 설치  (0) 2019.10.09
    미네랄  (0) 2019.10.09
    트리의 지름  (0) 2019.10.09

    댓글

Designed by Tistory.