4
int solve(vector<int> &houses, int pos, int k) {6
if (pos >= houses.size()) return k ? 1e9 : 0;7
if (dp[pos][k] != -1) return dp[pos][k];9
// at current position pos, spread the group from (pos upto j) and allot10
// this whole group 1 mailbox. start new neigbour at j + 113
for (int j = pos; j < houses.size(); ++j) {14
int middle = (pos + j) / 2, cost = 0;16
for (int i = pos; i <= j; ++i) cost += abs(houses[middle] - houses[i]);18
ans = min(ans, cost + solve(houses, j + 1, k - 1));20
return dp[pos][k] = ans;22
int minDistance(vector<int> &houses, int k) {23
sort(begin(houses), end(houses));24
memset(dp, -1, sizeof(dp));26
return solve(houses, 0, k);