출처 : 1520번: 내리막 길 (acmicpc.net)
풀이 방법
처음에는 dfs로 풀이하였는데 시간 초과가 나서 dfs에 dp를 적용해서 풀이하여 통과하였다.
#include <bits/stdc++.h>
using namespace std ;
int M, N, ans = 0;
int dp[501][501];
vector<vector<int>> board;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
int dfs(int y,int x) {
if (y == M-1 && x == N-1) { // 목표 지점에 도착
return 1;
}
else if (dp[y][x] == -1) {
dp[y][x] = 0;
for (int i = 0;i < 4;i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < M ) {
if (board[y][x] > board[ny][nx]) { // 내리막 길
dp[y][x] += dfs(ny, nx); // dp 갱신
}
}
}
}
return dp[y][x];
}
int main () {
cin >> M >> N;
memset(dp, -1, sizeof(dp));
for (int i = 0;i < M;i++) {
vector<int> temp;
for (int k = 0;k < N;k++) {
int num;
cin >> num;
temp.push_back(num);
}
board.push_back(temp);
}
cout << dfs(0, 0) << endl;
return 0;
}
'Algorithm' 카테고리의 다른 글
[백준] 포도주 시식 2156번 (c++) (0) | 2021.12.08 |
---|---|
[백준] 치즈 2638번 (c++) (0) | 2021.12.01 |
[백준] 나이트의 이동 7562번 (c++) (0) | 2021.10.26 |
[백준] LCS 9251번 (c++) (0) | 2021.09.15 |
[백준] 알파벳 1987번 (c++) (0) | 2021.09.09 |