728x90
https://www.acmicpc.net/problem/1520
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 |