티스토리 뷰

 


[BOJ 1520(G4) 리뷰]

언뜻보면 그냥 BFS,DFS문제로 보이지만 DP를 이용하여 풀지 않으면 시간초과가 난다.

따라서 목적지 까지 갔던 경로를 기억해야 하고 지금 가고있는 경로가 이미 목적지에 도착했던 경로라면 굳이 목적지 까지 갈필요가 없다. 이를 DP배열을 통해 구현했다.

 

목적지에 도착했을때에만 1을 반환하도록 하면 결국 DP[1][1]에는 목적지 까지 도착한 경로의 갯수만이 저장될것이다.

 


#include <bits/stdc++.h>
using namespace std;
int N, M;
int board[501][501];
int dp[501][501];

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

int dfs(int r, int c)
{
    if (r == N && c == M) return 1;
    if (dp[r][c]!=-1) return dp[r][c];

    dp[r][c] = 0;
    for (int dir = 0; dir < 4; dir++)
    {
        int nr = r + dx[dir];
        int nc = c + dy[dir];
        if (nr <1 || nr>N || nc < 1 || nc > M) continue;
        if (board[nr][nc] >= board[r][c]) continue;
        dp[r][c] += dfs(nr, nc);
    }

    return dp[r][c];
}



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

    cin >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= M; j++)
            cin >> board[i][j];
    }
    
    for (int i = 1; i <= N; i++)
    {
        fill(dp[i], dp[i] + M + 1, -1);
    }

    cout << dfs(1, 1);

}

'알고리즘 풀이 > 동적계획법' 카테고리의 다른 글

BOJ : 1937 욕심쟁이 판다  (0) 2020.08.31
BOJ : 2225 합분해  (0) 2020.08.31
BOJ : 11048 이동하기  (0) 2020.08.28
BOJ : 9465 스티커  (0) 2020.08.28
BOJ : 1932 정수 삼각형  (0) 2020.08.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함