n개의 3차원 좌표가 주어졌다고 가정하자. 좌표 (a, b, c)에서 (x, y, z)까지 이동하는 비용은 ∣ x − a∣ + ∣ y − b∣ + max(0, z − c)입니다. 첫 번째 좌표에서 시작하여 모든 좌표를 한 번 이상 방문한 다음 첫 번째 좌표로 돌아갑니다. 우리는 전체 여행의 총 비용을 알아내야 합니다. 좌표는 'coords' 배열에 제공됩니다.
따라서 입력이 n =3, coords ={{1, 1, 0}, {1, 3, 4}, {3, 2, 2}}인 경우 출력은 12가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
Define one 2D array tpa. tpa[1, 0] := 0 for initialize i := 1, when i < 2n, update (increase i by 1), do: for initialize j := 0, when j < n, update (increase j by 1), do: if i mod 2 is same as 0, then: Ignore following part, skip to the next iteration for initialize t := 0, when t < n, update (increase t by 1), do: x := first value of coords[t] y := second value of coords[t] z := third value of coords[t] p := first value of coords[j] q := second value of coords[j] r := third value of coords[j] tpa[i OR (1 bitwise left shift t)][t] := minimum of (tpa[i|(1 bitwise left shift t)][t], tpa[i][j] + |x - p| + |y - q| + maximum of (0, z - r)) res := infinity for initialize i := 0, when i < n, update (increase i by 1), do: x := first value of coords[0] y := second value of coords[0] z := third value of coords[0] p := first value of coords[i] q := second value of coords[i] r := third value of coords[i] res := minimum of (res and tpa[2n - 1, i] + |x - p| + |y - q| + maximum of (0 and z - r)) return res
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; #define N 100 int solve(int n, vector<tuple<int,int,int>> coords){ vector<vector<int>> tpa(pow(2, n), vector<int>(n, INF)); tpa[1][0] = 0; for(int i = 1; i < pow(2,n); i++) { for(int j = 0; j < n; j++){ if(i % 2 == 0) continue; for(int t = 0; t < n; t++) { int x, y, z, p, q, r; tie(x, y, z) = coords[t]; tie(p, q, r) = coords[j]; tpa[i | (1 << t)][t] = min(tpa[i|(1 << t)][t], tpa[i][j] + abs(x - p) + abs(y - q) + max(0, z - r)); } } } int res = INF; for(int i = 0; i < n; i++) { int x, y, z, p, q, r; tie(x, y, z) = coords[0]; tie(p, q, r) = coords[i]; res = min(res, tpa[pow(2, n) - 1][i] + abs(x - p) + abs(y - q) + max(0, z - r)); } return res; } int main() { int n = 3; vector<tuple<int,int,int>> coords = {{1, 1, 0}, {1, 3, 4}, {3, 2, 2}}; cout<< solve(n, coords); return 0; }
입력
3, {{1, 1, 0}, {1, 3, 4}, {3, 2, 2}}
출력
12