파게로그
[백준 1520번] 내리막 길 본문
문제 링크: 1520번 제목
https://www.acmicpc.net/problem/1520
P(i, j)가 (i, j)의 위치에서 출발지까지 가는 경로의 수를 나타낸다고 한다면 이는 다음과 같은 식으로 표현된다.
P(i, j) = sum({P(k, l) | (k, l)은 (i, j)와 인접 & (k, l)은 (i, j)보다 고도가 높음})
P(i, j)의 초기값을 -1로 설정해두어서 방문 여부를 표시한다면, (i, j)를 방문한 경우 P(i, j)를 바로 사용하면 되며 이는 다시 계산할 필요가 없다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int m;
static int n;
static int[][] map;
static int[][] dp;
static int[] drow = {-1, 0, 1, 0};
static int[] dcol = {0, 1, 0, -1};
public static int solution(int row, int col) {
// 출발지의 경로 수는 1
if (row == 1 && col == 1) return 1;
// 이미 계산한 적이 있는 위치이면 저장해둔 값을 사용
if (dp[row][col] != -1) return dp[row][col];
int sum = 0;
for (int d = 0; d < 4; d++) {
int r = row + drow[d];
int c = col + dcol[d];
if (r<0 || c<0 || r>m || c>n) continue;
if (map[r][c] <= map[row][col]) continue;
sum += solution(r, c);
}
dp[row][col] = sum;
return sum;
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] temp = bf.readLine().split(" ");
m = Integer.parseInt(temp[0]);
n = Integer.parseInt(temp[1]);
// create map
map = new int[m+1][n+1];
for (int i = 1; i <= m; i++) {
temp = bf.readLine().split(" ");
for (int j = 1; j <= n; j++)
map[i][j] = Integer.parseInt(temp[j-1]);
}
// create dp
dp = new int[m+1][n+1];
for (int i = 0; i <= m; i++)
for (int j = 0; j <= n; j++)
dp[i][j] = -1;
System.out.println(solution(m, n));
}
}
'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글
[백준 1260번] DFS와 BFS (0) | 2020.12.28 |
---|---|
[백준 2293번] 동전 1 (0) | 2020.12.18 |
[백준 11066번] 파일 합치기 (0) | 2020.12.18 |
[백준 11049번] 행렬 곱셈 순서 (0) | 2020.12.18 |
[백준 12865번] 평범한 배낭 (0) | 2020.12.14 |
Comments