[C++]백준1520번 내리막 길

1 minute read

문제는 다음과 같다.

오늘은 백준1520번 내리막 길 문제를 풀어보도록 하자. DFS와 DP를 이용한 문제이다. TOP-DOWN방식으로 구현을 해보았다. dp배열은 방문의 여부를 체크하기 위해 -1로 초기화를 해주었다. -1이면 방문하지 않은 것이고 0이면 방문을 한 것이다.

만일 이 문제를 DFS만으로 구현을 한다면 N,M이 500이었을 때 O(4^250000)의 시간복잡도를 갖게된다. 그러므로 TLE가 날 것이 뻔하다. 따라서 재귀함수를 이용한 TOP-DOWN 방식으로 메모이제이션을 하며 풀었다.

                                     [코드]
#include <iostream>
using namespace std;

int R, C;
int map[500][500];
int dp[500][500];
int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };

int find_the_road(int y, int x) {
	if (y == R - 1 && x == C - 1) {
		return 1;
	}
	if (dp[y][x] == -1) {
		dp[y][x] = 0;
		for (int i = 0; i < 4; i++) {
			int my = y + dir[i][0];
			int mx = x + dir[i][1];

			if (my >= 0 && mx >= 0 && my < R && mx < C) {
				if (map[my][mx] < map[y][x]) {
					dp[y][x] += find_the_road(my, mx);
				}
			}
		}
	}
	return dp[y][x];
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> R >> C;

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			cin >> map[i][j];
			dp[i][j] = -1;
		}
	}
	cout << find_the_road(0,0);
}