제출 #1132868

#제출 시각아이디문제언어결과실행 시간메모리
1132868DangKhoizzzzKronican (COCI16_kronican)C++20
100 / 100
699 ms4552 KiB
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pii pair <int , int>
#define ar3 array <int , 3>


using namespace std;

const int INF = 1e9 + 7;
const int maxn = 2e5 + 7;

int n , k , c[30][30], dp[(1 << 21)];

int getbit(int a , int b)
{
    return ((a >> b)&1);
}

int flip(int a , int b)
{
    return (a ^ (1 << b));
}

void solve()
{
    cin >> n >> k;

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

    for(int i = 0; i < (1 << n) ; i++) dp[i] = INF;

    dp[(1 << n) - 1] = 0;

    for(int mask = (1 << n) - 1; mask >= 0; mask--)
    {
        for(int i = 0; i < n; i++)
        {
            if(getbit(mask , i) == 1)
            {
                int cost = INF;

                for(int j = 0; j < n; j++)
                {
                    if(i != j && getbit(mask , j) == 1)
                    {
                        cost = min(cost , c[i][j]);
                    }
                }

                dp[flip(mask , i)] = min(dp[flip(mask , i)] , dp[mask] + cost);
            }
        }
    }

    int ans = INF;

    for(int mask = 0; mask < (1 << n); mask++)
    {
        if(__builtin_popcount(mask) <= k)
        {
            ans = min(ans , dp[mask]);
        }
    }
    cout << ans << '\n';
}


int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...