Algorithm/Baekjoon

[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λ¬Έ μ΄μš©ν•΄μ„œ 반볡