Submission #98445

#TimeUsernameProblemLanguageResultExecution timeMemory
98445luciocfKronican (COCI16_kronican)C++14
100 / 100
1942 ms16900 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 21;
const long long inf = 2e18+10;

typedef long long ll;

ll dp[1<<maxn];

int n, k;

int num[maxn][maxn];

ll solve(int mask)
{
	if (__builtin_popcount(mask) == k) return 0LL;
	if (dp[mask] != -1) return dp[mask];

	ll ans = inf;
	for (int i = 0; i < n; i++)
	{
		if (!(mask&(1<<i))) continue;

		for (int j = 0; j < n; j++)
		{
			if (j == i || !(mask&(1<<j))) continue;

			int mask2 = mask^(1<<i);

			ans = min(ans, (ll)num[i][j]+solve(mask2));
		}
	}

	return dp[mask] = ans;
}

int main(void)
{
	cin >> n >> k;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			cin >> num[i][j];

	memset(dp, -1LL, sizeof dp);

	cout << solve((1<<n)-1) << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...