[백준] 1520 내리막길
그냥 도착지점에서 올라가는걸로 구했다. 요새 계속 탑다운 방식만 썼더니 이쪽으로 기울어짐..
import java.util.*;
import java.io.*;
public class Main{
static int n;
static int m;
static int[][] map;
static int[][] d;
static int[] dx = {1, -1, 0, 0};
static int[] dy = {0, 0, 1, -1};
static int go(int x, int y){
if( x == 0 && y == 0 ){ // 출발지에 도착하면 탈출쓰
return 1;
}
if(d[x][y] != -1){ // 메모된거 꺼내쓰기
return d[x][y];
}
int ans = 0; // 답을 담을 변수
for(int k = 0 ; k < 4 ; k++){ // 다음 좌표 소환
int nx = x + dx[k];
int ny = y + dy[k];
if( nx >= 0 && nx < n && ny >= 0 && ny < m){ // 지도상에 있다면
if(map[nx][ny] > map[x][y]){ // 그리고 오르막길이라면
ans += go(nx, ny); // 간닷~
}
}
}
d[x][y] = ans; // 메모이제이션
return ans; // 날 부른 go에게 보낼 값
}
public static void main(String []args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][m];
d = new int[n][m];
for(int i = 0 ; i < n ; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < m ; j++){
map[i][j] = Integer.parseInt(st.nextToken());
d[i][j] = -1;
}
}
System.out.println(go(n-1, m-1));
}
}
Comments