문제 : https://www.acmicpc.net/problem/1520


[알고리즘풀이]

경로를 DFS로 역으로 탐색하며, 경우의 수를 저장한다.

dp[i][j] : (i , j )부터 목표 지점인 (0, 0)까지 가는 경우의 수.

이때, dp[i][j]에 밟아보지 않은 지점과 밟았는데 (0, 0)까지 가는 경로가 없는 경우를 구분해줘야 된다.

그렇지 않으면, 밟았던 경로도 다시 탐색하기 때문에 시간 초과에 걸린다.

따라서, 밟아보지 않은 지점에는 dp[i][j] = -1 을 저장하고, 경로가 없는 경우에는 dp[i][j] = 0이 저장되게,

dp[][] 배열을 -1로 초기화해줘야 한다.

#include<iostream>
#include<vector>
#include<queue>

using namespace std;

int N, M, map[500][500], dp[500][500];
int dir_x[4] = { -1,0,1,0 }, dir_y[4] = { 0, 1, 0, -1 };

int get_count(int, int);

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> N >> M;
	for (int i = 0; i < N; i++){
		for (int j = 0; j < M; j++){
			cin >> map[i][j];
			dp[i][j] = -1;
		}
	}
	cout << get_count(N - 1, M - 1);
}

int get_count(int i, int j) {
	if (dp[i][j] != -1)
		return dp[i][j];
	if (i == 0 && j == 0)
		return 1;
	dp[i][j] = 0;
	for (int k = 0; k < 4; k++) {
		int s_x = i + dir_x[k];
		int s_y = j + dir_y[k];
		if (0 <= s_x && s_x < N && 0 <= s_y && s_y < M && map[i][j] < map[s_x][s_y]) {
			dp[i][j] += get_count(s_x, s_y);
		}
	}
	return dp[i][j];
}

 

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 2003 - 수들의 합  (0) 2019.09.30
[BOJ] 10819 - 차이를 최대로  (0) 2019.09.30
[BOJ] 2522 - '별 찍기 - 12'  (0) 2019.09.29
[BOJ] 13458 - 시험 감독  (0) 2019.09.29
[BOJ] 2446 - '별 찍기 - 9'  (0) 2019.09.29

+ Recent posts