알고리즘/백준 알고리즘

백준 1520번 내리막 길[C++]

빠켱이 2021. 2. 21. 13:26
#include <iostream>

using namespace std;

int m, n, h = 0;
int map[501][501];
int dp[501][501] = {0,};
int dy[4] = {-1,1,0,0};
int dx[4] = {0,0,-1,1};

int dfs(int y, int x){
    if(y == m-1 && x == n-1)        //도착지점 도달하면
        return 1;
    if(dp[y][x] != -1)              //한번도 안가본 길 이면
        return dp[y][x];
    dp[y][x] = 0;
    for(int i = 0; i < 4; i++){
        int yy = y + dy[i];
        int xx = x + dx[i];
        if(0 <= yy && yy < m && 0 <= xx && xx < n)
            if(map[y][x] > map[yy][xx])
                dp[y][x] += dfs(yy, xx);
    }
    return dp[y][x];
}

int main(){
    scanf("%d %d", &m, &n);
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++){
            scanf("%d", &map[i][j]);
            dp[i][j] = -1;
        }
    printf("%d", dfs(0,0));
}