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] = { 1, 0 }; int dy[2] = { 0, 1 }; long long dfs(int x, int y) { visited[x][y] = 1; if (x == N - 1 && y == N - 1) return 1; long long &ret = dp[x][y]; if (ret) return ret; if (board[x][y] == 0) return 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] == 0) continue; 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 |