| boj1520 | https://www.acmicpc.net/problem/1520 |
|---|

접근방법 또는 고려해야할 점
오른쪽, 아래 이런식으로만 움직이는 경우의 수를 세는 것이 아니기 때문에, DFS + DP를 적용함.
만약 Memoization을 사용안하고 N-1,M-1에 도달할 때마다 answer++를 하게되면 중복된 경로를 또 계산할 수 있음.
dp[x][y] += dfs(newX,newY);
코드
package self;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class boj1520 {
static int N;
static int M;
static int[][] map;
static int[][] dp;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static int dfs(int x, int y){
if(x==N-1 && y==M-1) return 1; // 도달했으면 return 1;
if(dp[x][y] != -1) return dp[x][y]; // 이미 계산된 것이면 계산된값 그대로 return;
dp[x][y] = 0;
for(int i = 0; i<4; i++){
int newX = x+dx[i];
int newY = y+dy[i];
if(newX < 0 || newY <0 || newX >= N || newY >= M) continue;
if(map[x][y] > map[newX][newY]){
dp[x][y] += dfs(newX, newY);
}
}
return dp[x][y];
}
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];
dp = 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());
dp[i][j] = -1;
}
}
System.out.println(dfs(0,0));
}
}
'알고리즘' 카테고리의 다른 글
| [JAVA] 백준 2533번 "사회망 서비스" (0) | 2025.05.11 |
|---|---|
| [JAVA] 백준1509번 "팰린드롬 분할" (0) | 2025.05.09 |
| [JAVA] 백준 7795번 "먹을 것인가 먹힐 것인가" (0) | 2024.07.16 |
| [JAVA] 0x09 백준 9466번 "텀 프로젝트" (0) | 2024.07.02 |
| [JAVA] 0x08 백준 2504번 "괄호의 값" (1) | 2024.06.26 |