https://www.acmicpc.net/problem/1937
1937번: 욕심쟁이 판다
n × n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에
www.acmicpc.net
문제
코드
import java.io.*;
import java.util.*;
public class Main {
private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static int[][] node;
private static int[][] dp;
private static int n;
private static int[] rangeX = {-1, 1, 0, 0};
private static int[] rangeY = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
n = Integer.parseInt(bf.readLine());
node = new int[n][n];
dp = new int[n][n];
for(int i = 0 ; i < n ; i++) {
StringTokenizer st = new StringTokenizer(bf.readLine());
for(int j = 0 ; j < n ; j++) {
node[i][j] = Integer.parseInt(st.nextToken());
}
}
int ans = 0;
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
ans = Math.max(ans, dfs(i, j));
}
}
bw.write(Integer.toString(ans));
bf.close();
bw.flush();
bw.close();
}
public static int dfs(int x, int y) {
if(dp[x][y] != 0) {
return dp[x][y];
}
dp[x][y] = 1;
int dx, dy;
for(int i = 0 ; i < 4 ; i++) {
dx = x + rangeX[i];
dy = y + rangeY[i];
if(dx < 0 || dy < 0 || dx > n-1 || dy > n-1) {
continue;
}
if(node[x][y] < node[dx][dy]) {
dp[x][y] = Math.max(dp[x][y], dfs(dx, dy) + 1);
dfs(dx, dy);
}
}
return dp[x][y];
}
}
다이나믹 프로그래밍과 그래프탐색이 섞인 문제였습니다. 저번 알고스팟이랑 비슷한 것 같은데 이게 더 쉽네요..
'코딩테스트' 카테고리의 다른 글
[백준] 1263번 '시간 관리' - Java (1) | 2023.07.31 |
---|---|
[백준] 5582번 '공통 부분 문자열' - Java (1) | 2023.07.29 |
[백준] 1756번 '피자 굽기' - Java (0) | 2023.07.27 |
[백준] 1027번 '고층 건물' - Java (1) | 2023.07.26 |
[백준] 1484번 '다이어트' - Java (0) | 2023.07.25 |