문제
https://www.acmicpc.net/problem/1937
걸린 시간
00 : 28 : 48
풀이
C++
#include <bits/stdc++.h>
#define INF 987654321
using namespace std;
int n;
int forest[500][500];
int cache[500][500];
int dy[4] = {1, -1, 0, 0};
int dx[4] = {0, 0, -1, 1};
int dp(int y, int x){
// 메모이제이션
int& ret = cache[y][x];
if(ret != -1)
return ret;
// 재귀 호출
ret = 1;
for(int i = 0; i < 4; i++){
int ny = y+dy[i];
int nx = x+dx[i];
if(0 <= ny && ny < n && 0 <= nx && nx < n)
if(forest[y][x] < forest[ny][nx])
ret = max(ret, dp(ny, nx)+1);
}
return ret;
}
int solve(){
int ans = 0;
for(int y = 0; y < n; y++)
for(int x = 0; x < n; x++)
ans = max(ans, dp(y, x));
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> forest[i][j];
memset(cache, -1, sizeof(cache));
cout << solve();
return 0;
}
모든 지점에서 이동할 수 있는 최대 경로를 찾는 완전 탐색의 경우 O(n4) 복잡도를 가지며 최대 5004 = 62,500,000,000
번으로 시간초과가 난다.
대나무 숲 속 현재 위치에서 움직일 수 있는 최대값을 캐쉬에 저장하는 메모이제이션을 적용할 경우 복잡도는 O(n2) 로 줄어든다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 4811번 알약 (0) | 2020.09.12 |
---|---|
Baekjoon 12869번 뮤탈리스크 (0) | 2020.09.12 |
Baekjoon 1916번 최소비용 구하기 (0) | 2020.09.10 |
Baekjoon 2206번 벽 부수고 이동하기 (0) | 2020.09.10 |
Baekjoon 2293번 동전 1 (0) | 2020.09.10 |
댓글