문제 링크입니다: https://www.acmicpc.net/problem/11060
간단한 메모이제이션을 이용하면 쉽게 풀 수 있는 문제였습니다.
최대 arr[i]만큼 움직이는 것이므로 1부터 arr[i]만큼 움직여보는 것이 핵심이였습니다.
#include <iostream>
#include <algorithm>
#include <cstring> //memset
using namespace std;
const int INF = 987654321;
const int MAX = 1000;
int N;
int arr[MAX];
int cache[MAX];
int minJump(int start)
{
if (start == N - 1) //목적지 도달할 경우
return 0;
if (start >= N) //목적지 도달 못할 경우
return INF;
int &result = cache[start];
if (result != -1)
return result;
result = INF;
for (int i = 1; i <= arr[start]; i++) //arr[start]이하 갈 수 있으므로
result = min(result, 1 + minJump(start+i));
return result;
}
int main(void)
{
cin >> N;
if (N<1 || N>MAX)
exit(-1);
for (int i = 0; i < N; i++)
cin >> arr[i];
memset(cache, -1, sizeof(cache));
int result = minJump(0);
if (result == INF)
cout << -1 << endl;
else
cout << result << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2240번 자두나무 (0) | 2018.03.16 |
---|---|
백준 9084번 동전 (0) | 2018.03.14 |
백준 2302번 극장 좌석 (0) | 2018.03.11 |
백준 2098번 외판원 순회 (4) | 2018.03.11 |
백준 2631번 줄세우기 (0) | 2018.03.10 |