https://www.acmicpc.net/problem/21317
21317번: 징검다리 건너기
산삼을 얻기 위해 필요한 영재의 최소 에너지를 출력한다.
www.acmicpc.net
매우 큰 점프는 1번 이하로 사용할 수 있기 때문에,
dp[i][0] = 매우 큰 점프를 사용하지 않았을 때 i번째 돌에 올 수 있는 최소 에너지
dp[i][1] = 매우 큰 점프를 사용한 후 i번째 돌에 올 수 있는 최소 에너지
로 정의하고 구현하였다.
매우 큰 점프는 2개의 돌을 건너뛰어 이동하므로
dp[2][0] = a[1].first;
dp[3][0] = min(a[1].second, a[1].first + a[2].first); 이다.
#include <iostream>
using namespace std;
int n, k, dp[30][2];
pair<int, int> a[30];
int main() {
cin >> n;
for (int i = 1; i < n; i++) {
cin >> a[i].first >> a[i].second;
}
for (int i = 2; i <= n; i++) {
dp[i][0] = dp[i][1] = 1000000000;
}
cin >> k;
dp[2][0] = a[1].first;
dp[3][0] = min(a[1].second, a[1].first + a[2].first);
for (int i = 4; i <= n; i++) {
dp[i][0] = min(dp[i][0], min(dp[i - 1][0] + a[i - 1].first, dp[i - 2][0] + a[i - 2].second));
dp[i][1] = min(dp[i][1], dp[i - 3][0] + k);
dp[i][1] = min(dp[i][1], min(dp[i - 1][1] + a[i - 1].first, dp[i - 2][1] + a[i - 2].second));
}
cout << min(dp[n][0], dp[n][1]);
}
'ps' 카테고리의 다른 글
[백준] 20665 - 독서실 거리두기 (0) | 2022.11.04 |
---|---|
[백준] 1368 - 물대기 (0) | 2022.09.21 |
[백준] 1188 - 음식 평론가 (1) | 2022.09.21 |
[백준] 20207 - 달력 (0) | 2022.09.19 |
[백준] 20437 - 문자열 게임 2 (1) | 2022.09.19 |
댓글