※ 웹 환경에 최적화된 서식이므로 웹 페이지로 열람함을 권장.
점프 게임(링크)
게임판의 각 지점에 적힌 숫자대로 오른쪽 또는 아래로 이동할 수 있으므로 대략 2^(격자 개수) 가지의 경우의 수가 있다.최대 100 x 100개의 칸이 있으므로 모든 칸에서의 도달 가능 여부를 검사하기는 무리다.
그런데 어떤 지점들은 여러 경로로 도달할 수 있다. 즉, 중복으로 계산되는 경로가 있으므로 한번 계산한 경로는 저장하고 필요할 때 꺼내서 사용한다.
#include <iostream>
#include <vector>
using namespace std;
// Initial state: -1, NO: 0, YES: 1
int cache[100][100];
int jumpGame(vector<vector<int>> board, int y, int x) {
int goal = board.size() - 1;
// Out of range.
if (goal < y || goal < x) return 0;
// Arrived!
if (goal == y && goal == x) return 1;
int& ret = cache[y][x];
if (ret != -1) return ret;
return ret = jumpGame(board, y + board[y][x], x) || jumpGame(board, y, x + board[y][x]);
}
'문제 해결 알고리즘 기초 > 동적 계획' 카테고리의 다른 글
최적해 문제를 동적 계획법으로 구하는 순서 (0) | 2021.05.04 |
---|---|
[알고스팟] 최대 증가 부분 수열 - 동적 계획, 최적해, 최적 부분 구조 (0) | 2021.05.04 |
동적 계획과 최적화 문제, Triangle Path(알고스팟) (0) | 2021.04.27 |
[알고스팟] Wild Card - 동적 계획 (0) | 2021.04.21 |
동적 계획법에 대해서, 이항 계수 문제 (0) | 2020.09.21 |