728x90

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

 

1520번: 내리막 길

첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다. M과 N은 각각 500이하의 자연수이고, 각 지점의 높이는 10000이하의 자연수이다.

www.acmicpc.net

dfs+dp로 풀 수 있었다. 리턴값이 있는 재귀함수에 더 익숙해져야겠다.

#include <iostream>
#include <vector>
using namespace std;

int n, m;
vector<vector<int>> v;
vector<vector<int>> dp;

int dfs(int row, int col) {
	if (dp[row][col] == -1) {
		dp[row][col] = 0;
		if (row + 1 < n && v[row][col] > v[row + 1][col]) {
			dp[row][col] += dfs(row + 1, col);
		}
		if (col + 1 < m && v[row][col] > v[row][col + 1]) {
			dp[row][col] += dfs(row, col + 1);
		}
		if (row - 1 >= 0 && v[row][col] > v[row - 1][col]) {
			dp[row][col] += dfs(row - 1, col);
		}
		if (col - 1 >= 0 && v[row][col] > v[row][col - 1]) {
			dp[row][col] += dfs(row, col - 1);
		}
	}
	return dp[row][col];
}

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	cin >> n >> m;
	v = vector<vector<int>>(n, vector<int>(m));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> v[i][j];
		}
	}
	dp = vector<vector<int>>(n, vector<int>(m, -1));
	dp[n - 1][m - 1] = 1;
	cout << dfs(0, 0);
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1699번 제곱수의 합  (0) 2020.03.13
[백준] 2294번 동전 2  (0) 2020.03.12
[백준] 2293번 동전 1  (0) 2020.03.08
[백준] 1057번 토너먼트  (0) 2020.03.07
[백준] 2309번 일곱 난쟁이  (0) 2020.03.07

+ Recent posts