짱아의 개발 기록장

백준 1890번. 점프(c++) / DP 본문

Algorithm/Baekjoon

백준 1890번. 점프(c++) / DP

jungahshin 2020. 7. 22. 14:15
반응형

DP를 활용한 문제이다.

문제를 보자마자 DP를 이용하면 쉽게 풀 수 있겠다는 생각을 했다.

 

dp라는 2차원배열을 선언하고 -1로 초기화 시켰다.

이렇게 하면 visited배열을 선언하지 않아도 -1값을 가지면 처음 방문한 좌표라는 것을 알 수 있다.

 

그리고 (1, 1)좌표에서 시작해서 top-down방식으로 구현했다.

또한, 문제에서 "경로의 개수는 263-1보다 작거나 같다."라는 조건이 있기 때문에 dp배열을 long long으로 선언했다.

 

코드 첨부(c++)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// 점프
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
 
int n, x, y;
int game[101][101= {0, };
int dx[4= {10};
int dy[4= {01};
long long dp[101][101= {0, };
 
long long go(int X, int Y)
{
    if(X==&& Y==n){
        return 1;
    }
 
    if(dp[X][Y]==-1){
        dp[X][Y] = 0;
        for(int i=0; i<2; i++){
            int nx = X+game[X][Y]*dx[i];
            int ny = Y+game[X][Y]*dy[i];
            if(1<=nx && nx<=&& 1<=ny && ny<=n){
                dp[X][Y] += go(nx, ny);
            }
        }        
    }
 
    return dp[X][Y];
}
 
int main()
{
    memset(dp, -1sizeof(dp));
    cin>>n;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            cin>>game[i][j];
        }
    }
 
    //top-down 방식
    x = 1;
    y = 1;
    dp[x][y] = 0;
    for(int i=0; i<2; i++){
        int nx = x+game[x][y]*dx[i];
        int ny = y+game[x][y]*dy[i];
        if(1<=nx && nx<=&& 1<=ny && ny<=n){
            dp[x][y] += go(nx, ny);
        }
    }
 
    cout<<dp[1][1]<<"\n";
 
    return 0;
}
cs

 

문제 첨부

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

 

1890번: 점프

문제 N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다. 각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거��

www.acmicpc.net

 

반응형
Comments