본문 바로가기

Problem/DP

[C/C++] BOJ 1890 :: 점프

BOJ 1890 :: 점프




문제 링크 : https://www.acmicpc.net/problem/1890








자료형의 출력범위를 혼동해서.. unsigned int 로 했다가 틀렸다 ㅠㅠ 한 번에 맞출 수 있었는데...


그래도 문제를 보고 접근방식이 바로 생각났고 생각대로 코딩하여 답을 맞출 수 있어서 매우 뿌듯했다!




나의 풀이




DFS + DP 방식으로 문제 풀기


반환 조건

1. 종착역에 도착하면 1 반환

2. 이미 dp 배열에 값이 있으면 그 값 반환

3. 현재 board의 값이 0 이면 0 반환


반환된 값을 더하여 dp 배열 갱신 




==============================================================



나의 풀이 방법말고 처음부터 끝까지 순차적으로 dp 배열을 채워나가는 방법도 있다.




나의 코드 




Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_1890/BOJ_1890.cpp




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
// 백준알고리즘 1890번 :: 점프
#include<iostream>
using namespace std;
 
int N;
long long dp[101][101];
int visited[101][101];
int board[101][101];
 
// 하, 우
int dx[2= { 10 };
int dy[2= { 01 };
 
long long dfs(int x, int y)
{
    visited[x][y] = 1;
 
    if (x == N - 1 && y == N - 1return 1;
    long long &ret = dp[x][y];
    if (ret) return ret;
    if (board[x][y] == 0return ret;
 
    for (int i = 0; i < 2; i++)
    {
        int mx = x;
        int my = y;
 
        for (int j = 0; j < board[x][y]; j++)
        {
            mx += dx[i];
            my += dy[i];
        }
 
        if (mx < 0 || mx >= N || my < 0 || my >= N) continue;
        if (visited[mx][my]) continue;
        dp[x][y] += dfs(mx, my);
        visited[mx][my] = 0;
    }
    return ret;
}
 
int main()
{
    cin >> N;
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cin >> board[i][j];
        }
    }
 
    long long ans = dfs(0,0);
    cout << ans;
    return 0;
}
cs




또 다른 방법




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
// 백준알고리즘 1890번 :: 점프
#include<iostream>
using namespace std;
 
int N;
int board[101][101];
long long dp[101][101];
 
int main(void)
{
    cin >> N;
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cin >> board[i][j];
        }
    }
 
    dp[0][0= 1;
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            if (board[i][j] == 0continue;
            if (board[i][j] + i < N)
                dp[i + board[i][j]][j] += dp[i][j];
            if (board[i][j] + j < N)
                dp[i][j + board[i][j]] += dp[i][j];
        }
    }
 
    cout << dp[N - 1][N - 1];
 
    return 0;
}
cs


'Problem > DP' 카테고리의 다른 글

[C/C++] BOJ 11052 :: 카드 구매하기  (0) 2019.02.20
[C/C++] BOJ 2306 :: 유전자  (0) 2019.02.19
[C/C++] BOJ 1103 :: 게임  (0) 2019.02.05
[C/C++] BOJ 14925 :: 목장 건설하기  (0) 2019.02.05
[C/C++] BOJ 11727 :: 2×n 타일링 2  (0) 2019.01.13