컴공 일기248
게시글 주소: https://iu.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)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
인천-하와이의 약자라는데? 왜 난 지금 안거냐 + 연세대는 연희+세브란스였구나 큼..
-
캔깡통(조동사Can&가수Can 아님), 볼펜촉, 충전기 잭 외 정밀 소형 금속부품에 주로 사용된다.
-
문해전 시발새끼 4
풀때마다 책 집어던지고싶음
-
이렇게 풀면 답이 안 이상하게 나오는데 뭐가 문젠가요?
-
둘 중에 추천좀
-
뭐풀어야 할까요? 기출은 정리 다함
-
학추 신청서를 내러 가야만 한다!
-
수능 망해서 단국대 치대 정도의 성적을 거뒀으면 좋겠다
-
생각해보니 신기하넹
-
혼자공부한거 없이 주 네시간 과외하면서 걍 수업만 대충들엇는데 5->3 뽀록인가
-
뭐가 더 어려운 편임? (수완은 뒤에 모고 제외)
-
어땠나요? 저는 준킬러 턱턱 막혀서 머리아프던데 12,14,15,22,28틀 80점인데 1 될라나요
-
뜬금없는데 소신발언 하나 하자면 그냥 엔터회사의 돈벌이 아님? 대부분은 유사연애...
-
국어 질문이요 3
사진과 같아요
-
생명 낮3~높4가 목표인데 유전 어디 버려야하나요? 4
DNA상대량부터 막히는데 어디 버리면 될까요? 지구는 2등급 정도 나오는데 생명은...
-
중학교 때 이목구비 체형 목소리까지 유리아님 빼닮은 친구 있었는데 공부도 꽤 해서...
-
그 ❗️건❗️바❗️로 엘레강~서강 푸흐흡.
-
얼버잠 0
잔다
-
어쩐지 머가리가 안돌아가더라....
-
푸흐흡
첫번째 댓글의 주인공이 되어보세요.