3
vector<vector<int>> dp;5
int recurs(vector<vector<int>> &cost, vector<int> &v, int i, int mask) {6
if (dp[i][mask] != -1) return dp[i][mask];10
for (int j = 0; j < cost[0].size(); j++)11
res = min(res, recurs(cost, v, i + 1, (mask | (1 << j))) + cost[i][j]);12
return dp[i][mask] = res;15
for (int j = 0; j < cost[0].size(); j++) res += v[j] * (!(mask & (1 << j)));16
return dp[i][mask] = res;20
int connectTwoGroups(vector<vector<int>> &cost) {21
dp.resize(cost.size() + 1, vector<int>(5000, -1));23
vector<int> v(cost[0].size(), 0);25
for (int j = 0; j < cost[0].size(); j++) {27
for (int i = 0; i < cost.size(); i++) m = min(m, cost[i][j]);31
return recurs(cost, v, 0, 0);