알고리즘 문제 풀이/백준
[BOJ 22871] 징검다리 건너기 (large)
sun_young
2024. 3. 17. 01:20
📃 문제
https://www.acmicpc.net/problem/22871
22871번: 징검다리 건너기 (large)
$N$개의 돌이 일렬로 나열 되어 있다. $N$개의 돌에는 왼쪽부터 차례대로 수 $A_{1} A_{2} ... A_{i} ... A_{N}$로 부여되어 있다. 가장 왼쪽에 있는 돌에서 출발하여 가장 오른쪽에 있는 돌로 건너가려고
www.acmicpc.net
💻 코드
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int N;
long long bridge[1000001];
long long dp[1000001] = { 0 };
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; i++) cin >> bridge[i];
for (int i = 1; i < N; i++) dp[i] = 987654321; // 최솟값을 구해야 하기 때문에 최대한 큰 수로 초기화
for (int i = 1; i < N; i++) {
for (int j = 0; j < i; j++) {
dp[i] = min(dp[i], max(dp[j], (i - j) * (1 + abs(bridge[j] - bridge[i]))));
}
}
cout << dp[N - 1] << '\n';
}
메모리 및 시간
💡 풀이
- 입력받은 데이터 저장
- 점화식
- max(dp[j], (i - j) * (1 + abs(bridge[j] - bridge[i]))));
- dp[j] : j까지 이동하는데 발생한 힘
- (i - j) * (1 + abs(bridge[j] - bridge[i]))) : i번째 돌로 이동할 때 발생하는 힘 계산
- max 함수 사용 이유 : 문제에서 "돌을 한번 건너갈 때마다 쓸 수 있는 힘은 최대 K이다." → 힘의 상한선 구하기
- min(dp[j], ~)
- min 함수 사용 이유 : K의 최솟값을 구해야 한다
- for문 이용해서 반복