-
[22869] 징검다리 건너기 (small)BOJ 2021. 10. 12. 00:00
https://www.acmicpc.net/problem/22869
22869번: 징검다리 건너기 (small)
$N$개의 돌이 일렬로 나열 되어 있다. $N$개의 돌에는 수 $A_{1} A_{2} ... A_{i} ... A_{N}$로 부여되어 있다. 가장 왼쪽에 있는 돌에서 출발하여 가장 오른쪽에 있는 돌로 건너가려고 한다. 항상 오른쪽으
www.acmicpc.net
<문제>
O(N^2)으로 풀이가 가능하므로 조건만 잘 구현해주면 간단히 해결할 수 있는 문제이다.
필요한것은 이동이 가능한지에 대한 true혹은 false의 값일 뿐이므로
dp[]를 bool형으로 선언해주고, 초기상태를 dp[1] = true; 로 표현해주었다.
이후로는 시작점을 의미하는 큰 for()와 도착점을 의미하는 작은 for()를 돌려서
i에서 j로 갈때의 cost가 K보다 작고 -> (j - i) * (1 + (abs(a[i] - a[j])))
i에 도달할 수 있을때 -> dp[i] == true
dp[j]를 true로 갱신해주면 된다.
<소스코드>
12345678910111213141516171819202122#include <bits/stdc++.h>using namespace std;const int INF = 987654321;int n, k, a[5001];bool dp[5001];int main(void) {int i, j;cin >> n >> k;for (i = 1; i <= n; i++) cin >> a[i];dp[1] = true;for (i = 1; i <= n - 1; i++) {for (j = i + 1; j <= n; j++) {int cost = (j - i) * (1 + (abs(a[i] - a[j])));if (cost <= k && dp[i] == true) {dp[j] = true;}}}dp[n] == true ? cout << "YES" : cout << "NO";return 0;}cs 'BOJ' 카테고리의 다른 글
[2670] 연속부분최대곱 (0) 2021.10.12 [15489] 파스칼 삼각형 (0) 2021.10.12 [21317] 징검다리 건너기 (0) 2021.10.11 [22857] 가장 긴 짝수 연속한 부분 수열 (small) (0) 2021.10.11 [17071] 숨바꼭질 5 (0) 2021.10.11