Submission #1216091

#TimeUsernameProblemLanguageResultExecution timeMemory
1216091Rafael_AugustoKronican (COCI16_kronican)C++20
100 / 100
946 ms9680 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back
#define f first
#define s second
#define dbg(v) cerr << #v << " = " << v << "\n"
#define fall(i, s, n) for(int i=s; i<n; i++)
#define rfall(i, s, n) for(int i=s; i>=n; i--)

typedef pair<int, int> pii;
typedef tuple<int, int, int> trio;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MASK = (1<<20)+7;
const int MAXN = 20+7;

int n, k;
int dist[MAXN][MAXN];
int dp[MASK];
bool mark[MASK];

int bt(int mask){
    if(mark[mask]) return dp[mask];
    if(__popcount(mask) <= k) return 0;

    mark[mask]=1;

    int mn=1e9;

    fall(i, 0, n){
        if(((1<<i)&mask) == 0) continue;

        fall(j, 0, n) if(((1<<j)&mask) && i != j) mn = min(mn, bt(mask^(1<<i))+dist[i][j]);
    }

    return dp[mask]=mn;
}

int32_t main(){
    ios::sync_with_stdio(0); cin.tie(0);

    cin >> n >> k;

    fall(i, 0, n)
    fall(j, 0, n) cin >> dist[i][j];

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