mojo's Blog

[백준 11060] 점프 점프 본문

백준/Dynamic Programming

[백준 11060] 점프 점프

_mojo_ 2021. 9. 16. 20:21

문제 링크 => 11060번: 점프 점프 (acmicpc.net)

 

11060번: 점프 점프

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

www.acmicpc.net


다이나믹 프로그래밍 문제이다.

 

끝지점까지 문제에서 주어진 조건에 맞게 이동할 수 있는 경우 최소로 점프한 횟수를 반환하고

이동할 수 없는 경우 -1 를 반환한다.

 

i 번째에 점프할 수 있는 횟수를 A[i] 라고 할 때, 0 <= j <= A[i] 만큼 점프를 하도록 한다.

 

dp[x] 를 x번째로 이동하기 위한 최소 점프 횟수라고 할 때 다음과 같이 식을 세팅할 수 있다.

 

dp[i + j] = min(dp[i + j], dp[i] + 1);  

 

Solution Code

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
#include <string.h>
#include <cstring>
#include <queue>
#include <stack>
#define endl '\n'
#define INF 1000000000
#define ll long long

using namespace std;

int N, A[1002], dp[1002];

int f() {

	fill(dp, dp + N + 1, INF);
	dp[1] = 0;
	for (int i = 1; i <= N; i++) {
		for (int j = 0; j <= A[i]; j++) {
			if (i + j > N) break;
			dp[i + j] = min(dp[i + j], dp[i] + 1);
		}
	}

	return dp[N] == INF ? -1 : dp[N];
}

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin >> N;
	for (int i = 1; i <= N; i++) cin >> A[i];
	cout << f();

	return 0;
}

 

'백준 > Dynamic Programming' 카테고리의 다른 글

[백준 15989] 1, 2, 3 더하기 4  (0) 2021.09.23
[백준 15486] 퇴사 2  (0) 2021.09.17
[백준 1519] 부분 문자열 뽑기 게임  (0) 2021.08.08
[백준 13283] Daruma Otoshi  (0) 2021.08.07
[백준 22358] 스키장  (0) 2021.08.06
Comments