Algorithm, boj, 욕심쟁이 판다(1937)
풀이
- (0,0)에서 시작하는게 아니므로 모든 지점을 돌면서 확인해 봐야한다 ( 주석처리 1번 )
- 메모이제이션 기법을 사용해야하므로 dp값이 있는 지점은 그 값을 그대로 반환한다 ( 주석처리 2번 )
- 현재 대나무 숲보다 다음 칸 대나무 숲이 더 크다면 이동하고 (+1) 그 대나무 숲에서 이동 하도록 함수를 호출해준다 ( 주석처리 2번 )
- 상,하,좌,우 네번의 이동중에 가장 큰 값을 dp값에 저장해준다. ( 주석처리 4번 )
- 해당 자리에서도 하루를 보내므로 +1일 해준다( 주석처리 5번 )
소스
package org.baekjoon;
import java.util.Scanner;
public class test1937_dp_panda {
static int m;
static int[][] arr, dp;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
m = sc.nextInt();
arr = new int[m][m];
dp = new int[m][m];
for (int i=0; i<m; i++) {
for(int j=0; j<m; j++) {
arr[i][j] = sc.nextInt();
}
}
// 1.
for (int i=0; i<m; i++) {
for(int j=0; j<m; j++) {
fun(i,j);
}
}
// 5.
System.out.println(answer+1);
}
static int[] nx = {-1,1,0,0};
static int[] ny = {0,0,-1,1};
static int answer = 0;
public static int fun(int x, int y) {
// 2.
if (dp[x][y] > 0) return dp[x][y];
for (int i=0; i<4; i++) {
int dx = x+nx[i];
int dy = y+ny[i];
int newBamboo = 0;
if (dx<0 || dx>=m || dy<0 || dy>=m)
continue;
// 3.
if (arr[x][y] < arr[dx][dy]) {
newBamboo += fun(dx, dy) + 1;
// 4.
dp[x][y] = Math.max(dp[x][y], newBamboo);
}
}
answer = Math.max(answer, dp[x][y]);
return dp[x][y];
}
}
Reference