(0, 0)에서 (N - 1, N - 1)로 가는 경로의 수를 파악하는 문제다. 각 칸에는 그 칸으로부터 몇 칸을 움직일 수 있는지 정해져있으며, 오른쪽이나 아래로만 움직일 수 있다. 한 번에 움직일 수 있는 거리는 0보다 크거나 같고, 9보다 작거나 같다.
- 한 번에 움직일 수 잇는 거리가 0이 될 수도 있다는 점을 못봐서 한번 틀렸었다.(메모리 초과)
- 또한 가능한 경우의 수가 최대 $2^{63} - 1$이라고 제한을 줬으며, 중간값이 이 값보다 커질 가능성은 없으므로 cache는 long long 타입으로 해도 충분했다.
그 이외에는 주의할 사항이 없다.
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 | #include <iostream> using namespace std; #define FOR(i, N) for (int i = 0; i < N; i++) #define ll long long int N; int arr[100][100]; ll cache[100][100]; ll go(int y, int x) { if (y < 0 || x < 0 || y >= N || x >= N) return 0; if (cache[y][x]) return cache[y][x]; if (y == N - 1 && x == N - 1) { return 1; } if (arr[y][x] == 0) return 0; return cache[y][x] = go(y + arr[y][x], x) + go(y, x + arr[y][x]); } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N; FOR(i, N) { FOR(j, N) { cin >> arr[i][j]; } } cout << go(0, 0) << '\n'; } | cs |
'BOJ' 카테고리의 다른 글
[Programmers C++] Winter Coding(재시도) (0) | 2019.03.03 |
---|---|
[백준 C++] 7576, 7569번 토마토, 토마토 (0) | 2019.03.02 |
[백준 C++] 피사노 주기와 행렬 제곱을 활용한 피보나치의 수 구하기 (0) | 2019.01.14 |
[백준 C++] 1021, 5430번 회전하는 큐, AC (0) | 2019.01.13 |
[백준 C++] 10866, 1406번 덱, 에디터 (0) | 2019.01.11 |