본문 바로가기

백준/다이나믹 프로그래밍

점프점프

728x90

www.acmicpc.net/problem/11060

 

11060번: 점프 점프

재환이가 1×N 크기의 미로에 갇혀있다. 미로는 1×1 크기의 칸으로 이루어져 있고, 각 칸에는 정수가 하나 쓰여 있다. i번째 칸에 쓰여 있는 수를 Ai라고 했을 때, 재환이는 Ai이하만큼 오른쪽으로

www.acmicpc.net

#include <iostream>
#include <cstring>

using namespace std;


int main() {
	int n;
	int check[1001] = { 0, };
	check[1] = 1;
	cin >> n;
	int num;
	for (int i = 1; i <= n; i++) {
		cin >>num ;
		if (check[i] == 0) continue;
		for (int j = 1; (j <= num) && (i + j <= 1000); j++) {
			if (check[i + j] > check[i] + 1 || check[i + j] == 0) {
				check[i + j] = check[i] + 1;
			}
		}
	}
	
	if (check[n] == 0) { cout << -1 << endl; }
	else { cout << check[n] - 1 << endl; }
}

어떤알고리즘 어떤논리로?

- 다이나믹프로그래밍으로 풀었다. 첫번째 부터 시작해서 갈수있는 목적지까지 몇번 이동했는지 기록을 하는 메모이제이션(?) 기법을 사용했다. 그리고 만약에 기존에 기록한것보다 더 작은 값이 있으면 그 값으로 바꿔준다. 

어려웠던점

생각하는 것 만큼 구현하는게 조금 까다로웠다. 그래서 다른코드를 참고하기도 했다. 

'백준 > 다이나믹 프로그래밍' 카테고리의 다른 글

평범한 배낭  (0) 2021.02.17
파일 합치기  (0) 2021.01.22
1,2,3 더하기 4  (0) 2021.01.21
팰린드롬?  (0) 2021.01.20
이동하기  (0) 2021.01.19