✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2024-08-20 23:00:46
조회수 1,538

컴공 일기248

게시글 주소: https://i.orbi.kr/00068962554

백준 1937 DP / DFS 융합 문항 풀이


소감 : 본질은 DFS인데, DP의 메모이제이션 기법을 쓰지 않으면 시간 초과가 난다.

탐색 문제들은 제한 시간 + 데이터의 수를 적절히 참조하며 Time Complexity를 따져보는 것이 첫 번째다.

완전 탐색을 해야하는데, 시간이 넉넉하다면 DFS 논리 하나로 가볍게 끌고가도 되지만 데이터 수가 생각보다 많아

제한 시간 내 모든 탐색이 불가능할 것 같으면 DP 냄새를 맡을 줄 알아야 한다.


아니면 더 근본적으로 완전 탐색 상황을 의심해볼 수도 있지만…

대놓고 DFS 였으니 이 부분은 이 문제에서 큰 의미없는 접근이겠다.



#include <iostream>

#include <algorithm> 

using namespace std;


// 상 -> 하 -> 좌 -> 우 순으로 DFS 탐색 순서를 정한다.

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

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


int forest[501][501];

int DP[501][501];

int N;  //find_max의 참조를 위해서 전역변수 선언


int find_max(int i, int j) {  

    if (DP[i][j] > 0) return DP[i][j];  // 메모이제이션


    DP[i][j] = 1;  


    for (int k = 0; k < 4; ++k) {

        int next_x = i + dx[k];

        int next_y = j + dy[k];


        if (0 <= next_x && next_x < N && 0 <= next_y && next_y < N) {

            if (forest[i][j] < forest[next_x][next_y]) {

                DP[i][j] = max(DP[i][j], find_max(next_x, next_y) + 1);

            }

        }

    }


    return DP[i][j];

}


int main() {

    ios::sync_with_stdio(false);  

    cin.tie(NULL);

    cout.tie(NULL);


    int res = -1;  // 결과 변수

    cin >> N;


    for (int i = 0; i < N; ++i) {

        for (int j = 0; j < N; ++j) {

            cin >> forest[i][j];

        }

    }


    for (int i = 0; i < N; ++i) {

        for (int j = 0; j < N; ++j) {

            res = max(res, find_max(i, j));

        }

    }


    cout << res << “\n”;

    return 0;

}

0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.