# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1114267 | ljtunas | Kronican (COCI16_kronican) | C++14 | 1014 ms | 8528 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define db double
#define pb push_back
#define ll long long
#define int long long
#define ii pair<int, int>
#define fi first
#define se second
#define vi vector <int>
#define vvi vector <vi>
#define vvvi vector <vvi>
#define vii vector<ii>
#define sqrt sqrtl
#define FORV(v, H) for(auto &v: H)
#define FOR(i, a, b) for(int i=a;i<=b;++i)
#define FORD(i, a, b) for(int i=a;i>=b;--i)
#define BIT(mask, i) ((mask >> i) & 1LL)
#define ONBIT(mask, i) (mask | (1LL << i))
#define OFFBIT(mask, i) (mask &~ (1LL << i))
#define cnt_BIT(i) __builtin_popcountll(i)
#define task "kronican"
const int MAXN = 20 + 10;
const int oo = 1e9 + 8;
const int MOD = 1e9 + 7;
int N, K;
int C[MAXN][MAXN];
vi dp;
int dis[MAXN][MAXN];
int solve(int mask) {
// cerr << mask << '\n';
if (cnt_BIT(mask) <= K) {
return 0;
}
if (dp[mask] != -1)
return dp[mask];
int cur = +oo;
FOR(i, 1, N) {
if (BIT(mask, i - 1) == 1)
FOR(j, 1, N) {
if (i != j && BIT(mask, j - 1) == 1) {
int newmask = OFFBIT(mask, i - 1);
newmask = ONBIT(newmask, j - 1);
cur = min(cur, solve(newmask) + C[i][j]);
}
}
}
return dp[mask] = cur;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
cout.tie(nullptr);
if (ifstream(task".inp")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
cin >> N >> K;
FOR(i, 1, N) FOR(j, 1, N) {
cin >> C[i][j];
}
dp.assign((1 << N) + 5, -1);
cout << solve((1 << N) - 1) << '\n';
// cout << (1 << N) - 1 << '\n';
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |