Problem Solving/BOJ
백준 1890번 점프 - C++ 풀이
어멘드
2023. 8. 9. 23:53
반응형
1. dp[r][c] : (r, c)에서 도착지점까지 가는 경로의 수
2. dp[r][c] = dp[r + board[r][c]][c] + dp[r][c + board[r][c]]
1. dp[r][c] : (r, c)에서 도착지점까지 가는 경로의 수
dp[r][c]를 위와 같이 정의하자. 기저사례는 도착지점인 경우가 되겠다.
2. dp[r][c] = dp[r + board[r][c]][c] + dp[r][c + board[r][c]]
각 칸에서 board[r][c]만큼 아래쪽으로 가는 방법과 오른쪽으로 가는 방법이 있으므로 이 두가지 방법으로 이동했을 때의 경로의 수를 더해주면 된다. 이때 점프 거리가 보드 밖으로 넘어가지 않는지 체크해주어야 하고, 만약 board[r][c] = 0인 경우 그 자리에서 바로 종료임에 유의하자. 또한 답은 int 범위를 벗어난다는 점 또한 주의해야 한다.
#include <iostream>
#include <string.h>
using namespace std;
const int MAX_N = 101;
typedef long long ll;
int N;
int board[MAX_N][MAX_N];
ll cache[MAX_N][MAX_N];
ll dp(int r, int c) {
if (r == N-1 && c == N-1) return 1;
ll& ret = cache[r][c];
if (ret != -1) return ret;
ret = 0;
if (board[r][c] == 0) return ret;
int nr = r + board[r][c];
int nc = c + board[r][c];
if (nr < N) ret += dp(nr, c);
if (nc < N) ret += dp(r, nc);
return ret;
}
int main() {
cin >> N;
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
cache[i][j] = -1;
cin >> board[i][j];
}
}
cout << dp(0, 0);
return 0;
}
반응형