import
java.util.Arrays;
import
java.util.Vector;
public
class
Main {
static
int
[][] costs =
new
int
[
100
][
100
];
static
int
[][] dp =
new
int
[
100
][
100
];
static
final
int
INF =
100
*
10000
;
static
int
solver(Vector<Integer> apartments,
int
n,
int
p,
int
i) {
if
(i == n && p ==
0
)
return
0
;
if
(i == n || p ==
0
)
return
INF;
if
(dp[p][i] != -
1
)
return
dp[p][i];
int
ans = INF;
for
(
int
j = i; j < n; j++) {
ans = Math.min(ans, costs[i][j] + solver(apartments, n, p -
1
, j +
1
));
}
return
dp[p][i] = ans;
}
static
int
minDistance(Vector<Integer> apartments,
int
p) {
int
n = apartments.size();
apartments.sort(Integer::compareTo);
for
(
int
[] row : dp) {
Arrays.fill(row, -
1
);
}
for
(
int
i =
0
; i < n; i++) {
for
(
int
j =
0
; j < n; j++) {
int
mid = apartments.get((i + j) /
2
);
for
(
int
k = i; k <= j; k++) {
costs[i][j] += Math.abs(mid - apartments.get(k));
}
}
}
return
solver(apartments, n, p,
0
);
}
public
static
void
main(String[] args) {
Vector<Integer> apartments =
new
Vector<>(Arrays.asList(
1
,
4
,
8
,
10
,
20
));
int
p =
4
;
System.out.println(minDistance(apartments, p));
}
}