import java.util.*;
import java.io.*;
public class Main {
static int N, map[][], dp[][], answer;
static int idx[] = { 0, 0, -1, 1 };
static int idy[] = { -1, 1, 0, 0 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
map = new int[N][N];
dp = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
answer = Math.max(fn(i, j),answer);
}
}
System.out.println(answer);
}
//큰 대나무에서 작은 대나무로 간다
static int fn(int x, int y) {
if(dp[x][y] !=0) return dp[x][y];
dp[x][y] =1;
for (int i = 0; i < 4; i++) {
int sx = x + idx[i];
int sy = y + idy[i];
if (sx < 0 || sy < 0 || sx >= N || sy >= N || map[x][y] <= map[sx][sy])
continue;
dp[x][y] = Math.max(dp[x][y], fn(sx,sy)+1);
}
return dp[x][y];
}
}
백준에선 정답이라 나오는데 특정 케이스에서 오버스택 에러남.
케이스
다른사람풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, ans;
static int[][] map, memo;
static int[] di = {-1, 1, 0, 0};
static int[] dj = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(in.readLine());
map = new int[N][N];
memo = new int[N][N];
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(in.readLine(), " ");
for(int j = 0 ; j < N ; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < N ; j++) {
if(memo[i][j] == 0) dfs(i, j);
}
}
System.out.println(ans);
}
static void dfs(int i, int j) {
int max = 0;
for(int d = 0 ; d < 4 ; d++) {
int ni = i + di[d];
int nj = j + dj[d];
if(ni < 0 || ni >= N || nj < 0 || nj >= N) continue;
if(map[i][j] < map[ni][nj]) {
if(memo[ni][nj] == 0) dfs(ni, nj);
max = Math.max(memo[ni][nj], max);
}
}
memo[i][j] = 1 + max;
ans = Math.max(memo[i][j], ans);
}
}