Algorithm

[백준] 내리막 길 1520번 (c++)

salmon16 2021. 10. 28. 11:16

출처 : 1520번: 내리막 길 (acmicpc.net)

 

1520번: 내리막 길

여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으

www.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