본문 바로가기

Algo/백준

1520: 내리막길 (DP)

풀이

dfs와 dp가 혼합된 문제이다.

visited배열을 boolean으로 생성하여 체크하지 않고 int로 생성하여 몇번 방문했는지 확인할 수 있게하였다.

0,0에서 시작해서 마지막 N-1, M-1에 도착하면 뒤로 돌아가면서 +하게 해주면 마지막에 도달할 수 있는 개수가 출력되게 된다.

 

코드

import java.util.Scanner;

public class Main {
	static int[][] arr;
	static int[][] visited;
	static int M;
	static int N;
	static int H = 0;
	static int[] dx = { -1, 1, 0, 0 };
	static int[] dy = { 0, 0, -1, 1 };

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		M = sc.nextInt();
		N = sc.nextInt();

		arr = new int[M][N];
		visited = new int[M][N];

		for (int i = 0; i < M; i++) {
			for (int j = 0; j < N; j++) {
				arr[i][j] = sc.nextInt();
				visited[i][j] = -1;
			}
		}

		System.out.println(dfs(0, 0));
	}

	public static int dfs(int i, int j) {
		if (i == M - 1 && j == N - 1)
			return 1;
		if (visited[i][j] == -1) {
			visited[i][j] = 0;
			for (int k = 0; k < 4; k++) {
				int nx = i + dx[k];
				int ny = j + dy[k];

				if (!(nx >= 0 && ny >= 00 && nx < M && ny < N))
					continue;

				if (arr[i][j] > arr[nx][ny])
					visited[i][j] += dfs(nx, ny);
			}
		}

		return visited[i][j];
	}
}

'Algo > 백준' 카테고리의 다른 글

2491: 수열 (DP)  (0) 2021.02.19
13398: 연속합2 (DP)  (0) 2021.02.19
15990: 1,2,3 더하기 5 (DP)  (0) 2021.02.19
1912: 연속합 (DP)  (0) 2021.02.19
2156: 포도주 시식 (DP)  (0) 2021.02.19