๋ฌธ์ ๋งํฌ
10272๋ฒ: ํ์๊ธ ์ฌ๋ฅ๊พผ ๊น์ ์ (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<int, int>, int>, vector<pair<pair<int, int>, int>>, greater<pair<pair<int, int>, int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 512 + 5;
vector<pair<int, int>> planet;
double DP[MAX_N][MAX_N];
int T, N;
double distance(pair<int, int> X, pair<int, int> 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(0, 0) << "\n";
planet.clear();
}
return 0;
}
|
cs |
์๊ณ ๋ฆฌ์ฆ ํ์๋ ๋ถ๋ค์ ์ ๋ถ ๋๋จํ์ ๊ฒ ๊ฐ๋ค.
'๋ฐฑ์ค > Platinum' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 1028 : ๋ค์ด์๋ชฌ๋ ๊ด์ฐ (0) | 2022.03.23 |
---|---|
[BOJ] 13308 : ์ฃผ์ ์ (0) | 2022.03.15 |
[BOJ] 2842 : ์ง๋ฐฐ์ ํ์๋ (0) | 2022.03.10 |
[BOJ] 3197 : ๋ฐฑ์กฐ์ ํธ์ (0) | 2022.03.08 |
[BOJ] 1328 : ๊ณ ์ธต ๋น๋ฉ (0) | 2022.03.07 |