본문 바로가기
ps

[백준] 21317 - 징검다리 건너기

by kariskan 2022. 9. 21.

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

댓글