๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Platinum

[BOJ] 10272 : ํ˜„์ƒ๊ธˆ ์‚ฌ๋ƒฅ๊พผ ๊น€์ •์€

by Jaeguk 2022. 3. 11.
๋ฌธ์ œ ๋งํฌ

10272๋ฒˆ: ํ˜„์ƒ๊ธˆ ์‚ฌ๋ƒฅ๊พผ ๊น€์ •์€ (acmicpc.net)

 

10272๋ฒˆ: ํ˜„์ƒ๊ธˆ ์‚ฌ๋ƒฅ๊พผ ๊น€์ •์€

ํ˜„์ƒ๊ธˆ ์‚ฌ๋ƒฅ๊พผ์ธ ์ •์€์ด๋Š” ์ง€๊ธˆ ๋ฒ”์ฃ„์ž๋ฅผ ์ซ“๊ณ  ์žˆ๋Š” ์ค‘์ด๋‹ค. ์ •์€์ด๋Š” ๊ฐˆ์น˜ IIํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์šฐ์ฃผ๋ฅผ ๋Œ์•„๋‹ค๋‹ˆ๋ฉด์„œ ์กฐ์‚ฌ๋ฅผ ํ•˜๋Š”๋ฐ, 2์ฐจ์› ์œ ํด๋ฆฌ๋“œ ์šฐ์ฃผ์— ์กด์žฌํ•˜๋Š” N๊ฐœ์˜ ๋‹ค๋ฅธ ํ–‰์„ฑ์„ ๋ชจ๋‘ ๋ฐฉ๋ฌธ

www.acmicpc.net

 

ํ’€์ด

๋‚ด๊ฐ€ ๊ฐํžˆ ํ’€ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ์–ด๋ ค์› ๋˜ DP ๋ฌธ์ œ.

์ •์€์ด๋Š” ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐˆ ๋–„๋Š” X์ขŒํ‘œ๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์ด ๋˜๋„๋ก ํ–‰์„ฑ์„ ๋ฐฉ๋ฌธํ•˜๊ณ , ๋ฐ˜๋Œ€๋กœ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๊ฐˆ ๋•Œ๋Š” X์ขŒํ‘œ๊ฐ€ ๋‚ด๋ฆผ์ฐจ์ˆœ์ด ๋˜๋„๋ก ๋ฐฉ๋ฌธํ•ด์•ผํ•œ๋‹ค. ๋˜ํ•œ ์ตœ์†Œํ•œ์˜ ๊ฑฐ๋ฆฌ๋กœ ํ–‰์„ฑ์„ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•ด์•ผํ•œ๋‹ค.

์ตœ์†Œํ•œ์˜ ๊ฑฐ๋ฆฌ๋กœ ๋ชจ๋“  ํ–‰์„ฑ์„ ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ํ–‰์„ฑ์„ ๋‘ ๋ฒˆ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค!

๋ฌด์กฐ๊ฑด ์ œ์ผ ๋ ํ–‰์„ฑ์„ ์ฐ๊ณ  ์ถœ๋ฐœ์ ์œผ๋กœ ๋Œ์•„์˜ค๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์—

์ถœ๋ฐœ์ ~๋์  + ๋์ ~ ์ถœ๋ฐœ์ . ๋”ฐ๋ผ์„œ ์ถœ๋ฐœ์ ๊ณผ ๋์ ์€ ๋‘ ๋ฒˆ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์šฐ์ฃผ์„ ์ด ์ถœ๋ฐœ์ ์—์„œ ๋™์‹œ์— ์ถœ๋ฐœํ•ด์„œ ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๊ณ  ๋์ ์— ๋„๋‹ฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.

ํ—ˆ์ ‘ํ•˜๊ฒŒ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด์ž๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.  A๋Š” 1->2->4->5 ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ–ˆ๊ณ , B๋Š” 1->3->5 ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ•˜์ž. ๋‘ ๊ฒฝ๋กœ๋ฅผ ํ•ฉ์น˜๋ฉด 1->2->4>-5->3->1 ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ ๊ฑฐ๋ฆฌ์™€ ๋˜‘๊ฐ™๋‹ค.

DP[i][j] ๋Š” ํ•œ ์šฐ์ฃผ์„ ์€ ํ˜„์žฌ i๋ฒˆ์งธ ํ–‰์„ฑ์— ๋ฐฉ๋ฌธํ–ˆ๊ณ , ๋‹ค๋ฅธ ์šฐ์ฃผ์„ ์€ j๋ฒˆ์งธ ํ–‰์„ฑ์— ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๊ฑฐ๋ฆฌํ•ฉ์˜ ์ตœ์†Œ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ํ–‰์„ฑ์€ max(i,j) + 1๋ฒˆ์งธ ํ–‰์„ฑ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ˜„์žฌ i๋ฒˆ์งธ ํ–‰์„ฑ์— ์žˆ๋Š” ์šฐ์ฃผ์„ 1์ด ๊ฐˆ ์ˆ˜๋„ ์žˆ๊ณ  j๋ฒˆ์งธ ํ–‰์„ฑ์— ์žˆ๋Š” ์šฐ์ฃผ์„ 2๊ฐ€ ๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค.

์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ travel ์ด๋ผ๊ณ  ํ•˜๊ณ  max(i,j) + 1 = K ๋ผ๊ณ  ํ•˜๋ฉด

DP[i][j] = min(travel( K , j ) + distance( i , K ) , travel( i , K ) + distance( j , K )) ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

1. travel( K , J ) ๋Š” i ์— ์žˆ๋˜ ์šฐ์ฃผ์„ ์ด ์›€์ง์˜€๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ distance( i , K )๋ฅผ ๋”ํ•ด์ค€๋‹ค.

2. travel( i , K ) ๋Š” j ์— ์žˆ๋˜ ์šฐ์ฃผ์„ ์ด ์›€์ง์˜€๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ distance( j , K ) ๋ฅผ ๋”ํ•ด์ค€๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<intint>int>vector<pair<pair<intint>int>>, greater<pair<pair<intint>int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 512 + 5;
vector<pair<intint>> planet;
double DP[MAX_N][MAX_N];
int T, N;
 
double distance(pair<intint> X, pair<intint> Y) {
    return sqrt(pow(X.first - Y.first, 2+ pow(X.second - Y.second, 2));
}
 
double travel(int i, int j) {
    if (DP[i][j] >= 0)
        return DP[i][j];
    if (i == N - 1)
        return DP[i][j] = distance(planet[j], planet[N - 1]);
    if (j == N - 1)
        return DP[i][j] = distance(planet[i], planet[N - 1]);
    int next = max(i, j) + 1;
    return DP[i][j] = min(travel(next, j) + distance(planet[i], planet[next]),
        travel(i, next) + distance(planet[j], planet[next]));
}
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> T;
    while (T--) {
        cin >> N;
        int x, y;
        for (int i = 0; i < N; i++) {
            cin >> x >> y;
            planet.push_back({ x,y });
        }
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++)
                DP[i][j] = -1;
        }
        cout << travel(00<< "\n";
        planet.clear();
    }
    return 0;
}
cs

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ ์ „๋ถ€ ๋Œ€๋‹จํ•˜์‹  ๊ฒƒ ๊ฐ™๋‹ค.

728x90