• toc {:toc}

๋ฌธ์ œ ํ™•์ธํ•˜๊ธฐ

ํ’€์ด

์ด์›ƒํ•œ ๊ณณ์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ๋ชฉํ‘œ ์ง€์ ๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ๋ฌธ์ œ๋กœ, DFS์™€ DP๋ฅผ ์„ž์–ด์ค˜์•ผ ์‹œ๊ฐ„์ดˆ๊ณผ์—†์ด ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒ˜์Œ์—๋Š” stack์„ ์ด์šฉํ•ด bottom-up์œผ๋กœ ๋งˆ์ง€๋ง‰์— ๋„์ฐฉํ•˜๋Š” ํšŸ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜์—ฌ ํ’€์ดํ•˜๋ ค ํ–ˆ์ง€๋งŒ, ๋‹ค์Œ์˜ ๊ฒฝ์šฐ์—๋Š” ์ค‘๋ณต๋œ ๊ธธ์„ ์ง€๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ดˆ๊ณผ์— ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

๋•Œ๋ฌธ์— ๋„์ฐฉ์ง€์ ์—์„œ ์—ญ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ํšŸ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜๋ฉด์„œ ์ฒ˜์Œ ์‹œ์ž‘์ง€์ ๊นŒ์ง€ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋ฉด ์‹œ์ž‘์ง€์ ์—์„œ ๋„์ฐฉ์ง€์ ๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ํšŸ์ˆ˜๋ฅผ ์นด์šดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž…๋ ฅ ๋ฐฐ์—ด image

dist ๋ฐฐ์—ด image

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