본문 바로가기
백준BOJ/동적 계획법

백준 1520 내리막길

by 이일아 2022. 6. 25.
반응형

https://www.acmicpc.net/problem/1520

 

1520번: 내리막 길

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

www.acmicpc.net

 

 

 

EXPLANATION

 

DFS를 이용해서 풀면 된다.

첫 지점부터 목표지점으로 가는 길을 찾아가자.

어느 지점에서 갈 수 있는 길이 여러개 나오면 하나씩 먼저 갈 수 있는데 까지 갔다가 돌아온다.

목표 지점을 찍었다면 그 길을 돌아오면서 지나온 지점들에서 목표 지점까지 갈 수 있는 길의 횟수에 1을 더해주면된다.

 

 

ex)

예제 입력

4 5
50 45 37 32 30
35 50 40 20 25
30 30 25 17 28
27 24 22 15 10

 

지나간 길은 지나갔다고 표시.
길을 돌아오면서 지나온 지점들에서 목표 지점까지 갈 수 있는 길의 횟수에 1을 더함.

 

 

return DP[0][0] = 3

 

 

CODE

#include<iostream>
#define MAX 500
using namespace std;

int N, M, ans;
int MAP[MAX][MAX];
int DP[MAX][MAX];

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };


int DFS(int x, int y)
{
    if (x == N - 1 && y == M - 1) return 1;
    if (DP[x][y] != -1) return DP[x][y];

    DP[x][y] = 0;    //온 길 체크.
    for (int i = 0; i < 4; i++)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx >= 0 && ny >= 0 && nx < N && ny < M)
        {
            if (MAP[nx][ny] < MAP[x][y])
            {
                DP[x][y] = DP[x][y] + DFS(nx, ny);
            }
        }
    }
    return DP[x][y];
}



int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N >> M;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> MAP[i][j];
            DP[i][j] = -1;    //dp 초기화
        }
    }
    
    ans = DFS(0, 0);    //DP[0][0];
    cout << ans << "\n";

    return 0;
}

 

 

반응형

'백준BOJ > 동적 계획법' 카테고리의 다른 글

백준 2629 양팔저울  (0) 2022.06.26
백준 10942 팰린드롬?  (0) 2022.06.25
백준 11049 행렬 곱셈 순서  (0) 2022.06.25
백준 11066 파일 합치기  (0) 2022.06.25
백준 12865 평범한 배낭  (0) 2022.06.13

댓글