Cod sursa(job #2300899)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 12 decembrie 2018 12:02:58
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("sobo.in");
ofstream g ("sobo.out");

const long long INF = 10000000000000000;

char so[16][1001];

int n, l, cost[1005];
long long d[(1<<15)];

void citire ()
{
    f >> n >> l;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < l; j++)
        {
            f >> so[i][j];
        }
    }

    for (int i = 0; i < l; i++)
    {
        f >> cost[i];
    }
}

long long maxmultimi (long long S, long long x)
{
    int mult0 = 0, mult1 = 0;

    for (int k = 0; k < n; k++)
    {
        if ((S & (1 << k)) && so[k][x] == '0')
        {
            mult0 |= (1<<k);
        }

        if ((S & (1 << k)) && so[k][x] == '1')
        {
            mult1 |= (1<<k);
        }
    }

    if (mult0 == 0 || mult1 == 0) return INF;

    return max(d[mult0], d[mult1]);
}

void fac_dinamica ()
{
    for (int i = 1; i < (1<<n); i++)
    {
        if (i == (i & (-i)))
        {
            d[i] = 0;
        }
        else
        {
            long long val = INF;
            for (int j = 0; j < l; j++)
            {
                val = min(val, cost[j] + maxmultimi(i, j));
            }

            ///cout << i << " " << val << '\n';

            d[i] = val;
        }
    }

    g << d[(1<<n) - 1] << '\n';
}

int main()
{
    citire();
    fac_dinamica();
    return 0;
}