첫째 줄에 대나무 숲의 크기 n(1 ≤ n ≤ 500)이 주어진다.
그리고 둘째 줄부터 n+1번째 줄까지 대나무 숲의 정보가 주어진다.
대나무 숲의 정보는 공백을 사이로 두고 각 지역의 대나무의 양이 정수 값으로 주어진다.
대나무의 양은 1,000,000보다 작거나 같은 자연수이다.
첫째 줄에는 판다가 이동할 수 있는 칸의 수의 최댓값을 출력한다.
시간초과를 피하기위해 dp이용
dp[i][j]는 (i,j)를 시작점으로 했을 때의 판다가 이동할 수 있는 칸의 수의 최대값
즉, dp배열에 값을 저장해두고 maps의 모든 점을 돌면서 값이 가장 큰 것을 구하면 그게 바로 최종적으로 판다가 이동할 수 있는 칸의 수의 최대값
dp배열의 값이 0이 아니라면, 이미 dfs가 진행된 것이기 때문에 그 값을 그대로 리턴
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int n, result;
static int[][] maps,dp;
static int[] dx = {0, 0, -1, 1};
static int[] dy = {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());
maps = 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++) {
maps[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
result = Math.max(result, dfs(i, j));
}
}
System.out.println(result);
}
public static int dfs(int x,int y) {
if (dp[x][y] != 0) {
return dp[x][y];
}
int day = 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
if (maps[x][y] < maps[nx][ny]) {
day = Math.max(dfs(nx, ny) + 1, day);
dp[x][y] = day;
}
}
}
return day;
}
}