컴공 일기248
백준 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를 선물하세요.
-
진짜 가보자.. 25수능 응시하는 team건동홍이 남아있을진 모르겠지만 탈출해보자구요
-
흠.... 저는 수능 접수기준 30~40% 유출 예상해봅니다
-
동아시아사 기출 1
검더텅 빨더텅 중에 뭐풀까용… 검더텅만 풀어도 될까요? 백건아 기출문제집도 많이...
-
대성 17패스 4
살까말까 ㅈㄴ 고민되네 더 할인 안 하냐
-
서/연고/서/성한/중시/경이/외건…(이하 생략)
-
사문 도표 4
표 보고 계산하는 그런 도표는 2문제밖에 없는 건가요
-
무섭네 ㄷㄷ
-
[속보]피해자에 '공공임대' 최장 20년 제공...'전세 사기 특별법' 통과 2
전세 사기 피해자 지원 및 주거 안정에 관한 특별법 개정(전세 사기 특별법)이...
-
어떰? 비슷함?
-
사탐을 할수있을까요?
-
의대 증원되면 2
인서울 대학들 전반적으로 입결 낮아지긴 하겠죠? 등급 따긴 많이 어려워지겠지만 좀...
-
지치네.. 다들 체력 관리 잘하셔요
-
좋다
-
밥먹으러감
-
앱스키마 3
1,2,3 다 연계 위주인가요? 교재만 사서 풀려는데 작년에도 독서는 연계 따로 안...
-
둘중 하나만 해야되면 뭣?? 그리고 n제 워크북 필요성은??
-
국어를 아무리 박아도 3보다 아래는 안내려갈거고 32111하면 예쁘게 고대 최저...
-
가로 세로
-
2개 못풀어서 그냥 검토 진짜 열심히 했는데 오히려 계산 실수한건 못잡고 검산하다...
-
쇼타 3
첫번째 댓글의 주인공이 되어보세요.