우선, 경로의 개수의 최대값이 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 |