https://www.acmicpc.net/problem/11060
다이나믹 프로그래밍의 본질은 기본 문제를, 여러 작은 문제들로 나눠서 해결하는 것이다.
i번째 칸까지 점프하는 최소의 값을 생각해보자.
j를 i보다 작은 수라고 가정하면, 점프가 가능하므로 j의 범위는 1 ~ i - 1이 될 수 있다.
dp[i] = dp[j] + 1
if(j + arr[j] <= i)
가 성립된다.
하지만, 위처럼 코드를 작성하면 N * N의 시간복잡도가 발생한다.
j가 1 ~ i -1이라면 굳이 확인하지 않아도 되는 부분까지 확인이 이루어지고 있다.
dp[i + j] = dp[i] + 1(j <= arr[i])의 식으로 코드를 작성하면, dp[x] = -1인 구간은 체크하지 않아도 된다. 도달할 수 없는 곳이기 때문이다.
해설코드(C++).
#include <cstring>
#include <iostream>
using namespace std;
int N;
int dp[1001];
int main() {
cin >> N;
memset(dp, -1, sizeof(dp));
dp[1] = 0;
for(int i = 1; i <= N ;i++){
int val;
cin >> val;
if(dp[i] == -1) continue;
for(int j = 1; j <= val; j++){
if(i + j <= N && (dp[i + j] == -1 || dp[i + j] > dp[i] + 1))
dp[i + j] = dp[i] + 1;
}
}
cout << dp[N] << endl;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 1038] 감소하는 수(다이나믹 프로그래밍, 수학 풀이) (0) | 2020.04.20 |
---|---|
[BOJ 9084] 동전 (1) | 2020.04.19 |
[BOJ 2302] 극장 좌석(접근법 및 시행착오 공유) (0) | 2020.04.18 |
[BOJ 2098] 외판원 순회(비트마스크, 자세한 설명) (0) | 2020.04.15 |
[BOJ 10164] 격자상의 경로 (0) | 2020.04.12 |