- toc {:toc}
ํ์ด
์ด์ํ ๊ณณ์ผ๋ก ์ด๋ํ๋ฉด์ ๋ชฉํ ์ง์ ๊น์ง ์ด๋ํ๋ ๋ฌธ์ ๋ก, DFS์ DP๋ฅผ ์์ด์ค์ผ ์๊ฐ์ด๊ณผ์์ด ๋ฌธ์ ๋ฅผ ํ์ดํ ์ ์๋ค.
์ฒ์์๋ stack์ ์ด์ฉํด bottom-up์ผ๋ก ๋ง์ง๋ง์ ๋์ฐฉํ๋ ํ์๋ฅผ ์นด์ดํธํ์ฌ ํ์ดํ๋ ค ํ์ง๋ง, ๋ค์์ ๊ฒฝ์ฐ์๋ ์ค๋ณต๋ ๊ธธ์ ์ง๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ง ์ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด๊ณผ์ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
๋๋ฌธ์ ๋์ฐฉ์ง์ ์์ ์ญ์ผ๋ก ์ด๋ํ ์ ์๋ ํ์๋ฅผ ์นด์ดํธํ๋ฉด์ ์ฒ์ ์์์ง์ ๊น์ง ๋๋ฌํ ์ ์๋๋ก ์ค์ ํ๋ฉด ์์์ง์ ์์ ๋์ฐฉ์ง์ ๊น์ง ์ด๋ํ ์ ์๋ ํ์๋ฅผ ์นด์ดํธ ํ ์ ์๋ค.
์
๋ ฅ ๋ฐฐ์ด
dist ๋ฐฐ์ด
1์ธ ๊ฒฝ์ฐ์๋ ๋์ฐฉ์ง์ ์์ ํด๋น ์์น๊น์ง ์ค๋ ๋ฐฉ์์ด 1๊ฐ๋ง ์กด์ฌํ๋ค๋ ์๋ฏธ์ด๋ค.
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int board[501][501] = {0,};
int dist[501][501];
int M, N, res = 0;
int dfs(int X, int Y){
if(X == M-1 && Y == N-1){
return 1;
}
if(dist[X][Y] == -1){
dist[X][Y] = 0;
for(int dir = 0; dir < 4; dir++){
int nx = X + dx[dir];
int ny = Y + dy[dir];
if(nx < 0 || nx >= M || ny < 0 || ny >= N) continue;
if(board[X][Y] <= board[nx][ny]) continue;
dist[X][Y] += dfs(nx, ny);
}
}
return dist[X][Y];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> M >> N;
for(int row = 0; row < M; row++){
for(int col = 0; col < N; col++){
cin >> board[row][col];
dist[row][col] = -1;
}
}
cout << dfs(0, 0) << '\n';
return 0;
}