- 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;
}