본문 바로가기

BOJ

백준 1890 / 점프

우선, 경로의 개수의 최대값이 2^63-1이니 BFS로 풀면 메모리초과가 난다. (ex) 모든 칸이 1로된 100x100 게임판)


다이나믹 프로그래밍으로 풀어야 한다.



d[i][j]가 i,j에 도착할 수 있는 모든 경우의 수라고 했을때,


0보다 크고 i보다 작은 어떠한 k에 대해서


map[k][j] + k가 i가 되는 경우를 찾는다면, 


d[i][j]는 d[k][j]로 이루어질 것이다. 또한,


map[i][k] + k가 j가 되는 경우를 찾는다면


d[i][j]는 d[i][k]로 이루어질 것이다.




d의 값에 2^63-1이 들어갈 수 있으니 d는 long이상을 선언해주어야한다.





코드 (34~43번째 코드가 핵심)


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
#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
 
using namespace std;
 
int map[101][101];
long long d[101][101];
 
int dx[] = { 1,0 };
int dy[] = { 0,1 };
 
int ans = 0;
 
int main() {
    //freopen("Text.txt", "r", stdin);
 
    int n;
    cin >> n;
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> map[i][j];
        }
    }
 
    d[0][0= 1;
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            
            for (int k = 0; k < i; k++) {
                if (map[k][j] + k == i) {
                    d[i][j]+=d[k][j];
                }
            }
 
            for (int k = 0; k < j; k++) {
                if (map[i][k] + k == j) {
                    d[i][j]+=d[i][k];
                }
            }
 
        }
    }
 
    
    cout << d[n - 1][n - 1];
}
cs


'BOJ' 카테고리의 다른 글

백준 15989 / 1,2,3 더하기 4  (0) 2019.02.10
백준 10942 / 팰린드롬?  (0) 2019.02.09
백준 11048 / 이동하기  (0) 2019.02.08
백준 15558 / 점프 게임  (0) 2019.02.07
백준 6087 / 레이저 통신  (0) 2019.02.07