컴공 일기248
게시글 주소: https://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를 선물하세요.
-
지이이이이잉
-
입시 차원 말고, 학교 들어가서 커리어 짜는 과정에서 생각해보자면 문-이는...
-
떳냐? 3
적안 눈 떳다 전시안 개안완료
-
8월달 핵빡세네욘 수미잡수미잡
-
갠적으로 과학탐구공부 이게 젤 효율적인거 같은데 어떤가요? 0
개념>기출>기출풀이 최적화(풀이법 정립)>n제(경험쌓기&시간단축)>실모(시간관리)...
-
시발점 난이도 1
시발점만 꼼꼼히 하면 백분위 어느정도 나올까요?
-
예수 배신한 사람이 유다아님? 이라는 글을 보고 쓰는 글 저 정보를 모른다고 해서...
-
비타민c 챙겨먹기 냉동실 비우고 냉동고기 시키기
-
개설레네
-
부모님 몰래 무휴학반수 하고있는데요 곧 수능원서 접수철이라 제가 다니는...
-
영어 책 추천 1
영어 감 유지용으로 딱 1~2권만 꾸준히 풀려고 하는데 뭐 추천하시나요?
-
재밌다
-
day 당 맨 마지막 문제에서 난도 상승폭이 너무 커서 앞 부분 문제가 수월했다는...
-
코디 0
필릭스 라이즈 원빈 투바투 연준
-
ㄱㅊ나요?? 사실 이미 하는 중이긴 한데 아까 서성한 공대 목표면 사1과1...
-
번개가 반짝반짝 0
-
진짜 숨이 턱턱 막힌다 지금 내 상황이랑 너무 동떨어져있음.. Ptsd
-
사이사이 빈칸들이 ㄹㅈ드네 막판엔 엉덩이 붙히고있는것부터 힘들었다..수학 공부 비중...
-
가계부 작성 미루는중 합산된 지출내역 보면 현타올 것 같음
첫번째 댓글의 주인공이 되어보세요.